Rob*_*bin 5 c++ templates inner-classes template-templates
在 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;
Run Code Online (Sandbox Code Playgroud)
现在,我想一个嵌套类添加A和使用嵌套类为模板,模板参数S类的B,就像这样:
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
Run Code Online (Sandbox Code Playgroud)
我明白的声明b2和b3是错误,因为A::AA是不完整的,A<int>::AA是不是一个模板。
我希望能够声明类似于b2. 这个想法是A并且B应该都使用相同的类T。
我希望能够声明一些类似于A单独命名的子类的类。我能想到的另一个用途是它的多个子类A可以用作模板模板参数到B.
一个解决方法我看到的是从的子类中使用个人的名字不要A,使用b1声明(使用A作为模板的模板参数S的B),改变实施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;
Run Code Online (Sandbox Code Playgroud)
我看到的另一个解决方法是将类的模板模板参数减少B为一个简单的模板参数,并T通过其他方式确保相同。
还有其他可能吗?如果是,如何?
编辑:添加遗忘class的templateforB并将模板模板参数名称更改为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;
}
Run Code Online (Sandbox Code Playgroud)
如果由于任何原因您被限制使用 C++03,则类型别名将不可用。然后,您可以将“using”语句替换为 NestedAA 的以下定义:
template<class T>
class NestedAA : public A<T>::AA
{
};
Run Code Online (Sandbox Code Playgroud)
您可以创建模板别名:
template <typename T>
using innerAA = typename A<T>::AA;
Run Code Online (Sandbox Code Playgroud)
进而
B<int, innerAA> b42;
Run Code Online (Sandbox Code Playgroud)