在这种情况下,我的模板知识有点生疏。
在类A
(带有2个模板参数T1
和T2
的模板化类)中,如何正确声明{{1}中使用的函数参数myType
下面的方法:
f()
修改:使用时,template<typename T1, typename T2>
class A
{
void f(T1<T2> myType);
void g(T2 myType2)
}
是非模板类型,但T2
是模板类型。
原因是我的用例T1
可以单独使用,没有T2
。但是,我仍然希望根据T1
定义T2
(以明确依赖关系)。
答案 0 :(得分:0)
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);
}