在C++中使用模板类的嵌套类作为模板模板参数

Use nested class of templated class as template template parameter in C++

本文关键字:嵌套 参数 C++      更新时间:2023-10-16

在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

我知道b2b3的声明是错误的,因为A::AA不完整,A<int>::AA不是模板。

我希望能够声明类似于b2的东西.这个想法是AB都应该使用相同的类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;

我看到的另一种解决方法是将类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,则无法使用类型别名。然后,您可以将"using"语句替换为以下 NestedAA 定义:

template<class T>
class NestedAA : public A<T>::AA
{
};

您可以创建模板别名:

template <typename T>
using innerAA = typename A<T>::AA;

然后

B<int, innerAA> b42;

演示

假设你希望嵌套的情况工作,并且由于 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 声明需要一个额外的"类"来编译 g++ 5.4

template<class T, template<class T> class S>