在C++中使用模板类的嵌套类作为模板模板参数
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
作为模板模板参数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>
相关文章:
- 嵌套参数包扩展失败
- 嵌套定义与定义的参数 C++
- 如何避免嵌套模板中的模板参数重复
- 重构模板类,该类将其嵌套类用作另一个类的模板参数
- 以嵌套类为参数的友元模板声明
- 是否可以指定 C++20 个模板化 lambda 来推断嵌套在参数中的类型?
- 通过具有嵌套类的工厂类获取多个变异类模板参数包
- 嵌套模板类的模板类模板模板参数的专业化
- 不能使用嵌套结构中的联合元素作为 scanf() 的参数来存储所需的值
- 修改嵌套 lambda 中捕获的参数:gcc 与 clang?
- 声明嵌套在模板参数中的类型的变量?
- 将参考类型作为嵌套模板结构中的模板参数作为模板参数不起作用
- 模板嵌套类模板类作为与完全专业函数的参数
- C++ 17 可以处理嵌套的可变参数模板吗?
- 带有可变参数的嵌套宏在GCC中编译,但在MSVC中不编译
- 在C++中使用模板类的嵌套类作为模板模板参数
- 如何使用variadic参数包的嵌套模板类
- 如何在variadic模板中采用嵌套参数包
- 传递具有依赖嵌套参数类型的模板模板参数时出错
- gcc segfault在编译嵌套参数包代码上