使用模板参数创建模板类型
Posted
技术标签:
【中文标题】使用模板参数创建模板类型【英文标题】:Creating a template type using template parameters 【发布时间】:2016-12-04 22:11:05 【问题描述】:在这种情况下,我的模板知识有点生疏了。
在A
类(一个模板类,有两个模板参数T1
和T2
)内部,如何正确声明下面f()
方法中使用的函数参数myType
:
template<typename T1, typename T2>
class A
void f(T1<T2> myType);
void g(T2 myType2)
编辑:使用时T2
是非模板类型,而T1
是模板类型。
原因是我有T2
可以单独使用的用例,没有T1
。但是,我仍然想根据T1
定义T2
(以明确依赖关系)。
【问题讨论】:
您希望void f(int<char> myType);
做什么?这没有任何意义。
请展示一个简单的预期用例。
您的困惑可能来自您对术语的草率使用。没有“模板类型”之类的东西。有类型,也有模板。类型不是模板,模板也不是类型。类型可能result来自模板(特化),但将模板与其特化区分开来很重要。
同意,我不应该使用模板类型。为更正干杯!
【参考方案1】:
T2 是非模板类型,但 T1 是模板类型
在这种情况下,T1
应该是一个模板模板参数。
它遵循一个最小的工作示例:
template<template<typename> class T1, typename T2>
struct S
void f(T1<T2>)
void g(T2)
;
template<typename>
struct T ;
int main()
S<T, int> s;
s.f(T<int>);
s.g(42);
更多详情请参阅here。
但是,我仍然想根据 T1 定义 T2(以使依赖关系清晰)
如果您想明确依赖关系,还可以使用类似于以下示例中的部分特化来强制执行它:
template<typename>
struct S;
template<template<typename> class T1, typename T2>
struct S<T1<T2>>
void f(T1<T2>)
void g(T2)
;
template<typename>
struct T ;
int main()
S<T<int>> s;
s.f(T<int>);
s.g(42);
【讨论】:
以上是关于使用模板参数创建模板类型的主要内容,如果未能解决你的问题,请参考以下文章