[英]Use nested class of templated class as template template parameter in C++
在C ++中,我想在模板化的类中使用嵌套类作为模板模板参数。 对于非嵌套类,模式为:
template<class T>
class A {
public:
T a;
// ...
};
template<class T, template<class ST> class S>
class B {
public:
S<T> b;
// ...
};
B<int, A> b;
现在我想向A
添加一个嵌套类,并使用这个嵌套类作为B
类的模板模板参数S
,如下所示:
template<class T>
class A {
public:
class AA {
public:
T aa;
// ...
};
// ...
};
template<class T, template<class ST> class S>
class B {
public:
S<T> b;
// ...
};
B<int, A> b1; // ok
B<int, A::AA> b2; // error
B<int, A<int>::AA> b3; // error
我理解b2
和b3
的声明是错误的,因为A::AA
是不完整的, A<int>::AA
不是模板。
我希望能够声明类似于b2
东西。 这个想法是A
和B
都应该使用相同的T
类。
我希望能够声明一些类似于A
的类,并使用单独命名的子类。 我可以想到的另一个用途是A
多个子类,可以用作B
模板模板参数。
我看到的一个解决方法是避免在A
的子类上使用单个名称,使用b1
声明(使用A
作为B
模板模板参数S
)并相应地更改B
的实现(即使用S::AA<T>
而不是S<T>
):
template<class T, template<class ST> class S>
class B {
public:
S::AA<T> b;
// ...
};
B<int, A> b;
我看到的另一种解决方法是将B
类的模板模板参数减少为一个简单的模板参数,并通过其他方式确保相同的T
还有其他可能吗? 如果有,怎么样?
编辑 :在template
为B
添加了遗忘的class
,并将模板模板参数名称更改为ST
。
这对我有用:
template<class T>
class A {
public:
class AA {
public:
T aa;
// ...
};
// ...
};
template<class T, template<class ST> class S >
class B {
public:
S<T> b;
// ...
};
template<class T> using NestedAA = typename A<T>::AA;
int main()
{
B<int, NestedAA> b; // ok
return 0;
}
如果由于任何原因您受限于C ++ 03,则无法使用类型别名。 然后,您可以使用以下NestedAA定义替换“using”语句:
template<class T>
class NestedAA : public A<T>::AA
{
};
假设您只希望嵌套的情况起作用,并且由于AA本身不是模板,您可以删除B的第二个参数的模板,如下所示:
template<class T>
class A {
public:
class AA {
public:
T aa;
// ...
};
// ...
};
template<class T, class S>
class B {
public:
S b;
// ...
};
//B<int, A> b1; // error
B<int, A<int>::AA> b2; // ok
PS你原来的B声明需要一个额外的'class'来编译g ++ 5.4
template<class T, template<class T> class S>
您可以创建模板别名:
template <typename T>
using innerAA = typename A<T>::AA;
然后
B<int, innerAA> b42;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.