gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:26:30 26 4
gpt4 key购买 nike

在 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 添加一个嵌套类并使用这个嵌套类作为模板模板参数SB ,像这样:

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 的内容。这个想法是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通过其他方式。

还有其他可能吗?如果是,怎么办?

编辑:添加了忘记的classtemplate对于 B并将模板模板参数名称更改为 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
{
};

关于c++ - 在C++中使用模板类的嵌套类作为模板模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42856503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com