在CRTP中使用模板参数的嵌套类
Using nested class of template parameter in CRTP
假设我定义了一个模板T
,该模板使用模板参数P
的嵌套类,如下所示:
template<class P> class T
{
public:
T(P& p) : p(p) {}
P& p;
typename P::Nested& get_nested() { return p.nested; }
};
如果我声明一个类A
,其中包含一个名为Nested
的嵌套类,那么我可以毫无问题地定义一个类型为T<A>
的变量:
class A
{
public:
class Nested
{
public:
int i;
};
Nested nested;
};
void test2a()
{
A a;
a.nested.i = 1;
T<A> t_a(a);
t_a.get_nested().i = 2;
}
现在,我想声明一个类B
,它以同样的方式包括一个名为Nested
的嵌套类,并继承自T<B>
,如下所示:
class B : public T<B>
{
public:
class Nested
{
public:
int i;
};
Nested nested;
};
编译上述代码失败,错误为:"嵌套不是B的成员"
我想我理解发生了什么:在输入模板时,由于继承的原因,类B没有完全定义。
然而,我想知道是否有办法做这样的事情。。。
谢谢你的帮助。
您需要将get_nested
的返回类型的解析推迟到调用为止。
一种方法是使返回类型依赖于模板参数:
template<typename unused = void>
typename std::conditional<false, unused, P>::type::Nested&
get_nested() { return p.nested; }
另一种方法(由于C++14)是使用返回类型推导:
auto& get_nested() { return p.nested; }
我能够用简单的编译您的示例
template<class P> class T
{
public:
T(P& p) : p(p) {}
P& p;
auto& get_nested() { return p.nested; }
};
另一种方法,使用与@ecatmur相同的技巧,但简单一点:
template<class R = P>
typename R::Nested& get_nested() { return p.nested; }
类似地,在这里编译器必须推迟对P::Nested
的求值,直到调用get_nested()
。
相关文章:
- 嵌套参数包扩展失败
- 嵌套定义与定义的参数 C++
- 如何避免嵌套模板中的模板参数重复
- 重构模板类,该类将其嵌套类用作另一个类的模板参数
- 以嵌套类为参数的友元模板声明
- 是否可以指定 C++20 个模板化 lambda 来推断嵌套在参数中的类型?
- 通过具有嵌套类的工厂类获取多个变异类模板参数包
- 嵌套模板类的模板类模板模板参数的专业化
- 不能使用嵌套结构中的联合元素作为 scanf() 的参数来存储所需的值
- 修改嵌套 lambda 中捕获的参数:gcc 与 clang?
- 声明嵌套在模板参数中的类型的变量?
- 将参考类型作为嵌套模板结构中的模板参数作为模板参数不起作用
- 模板嵌套类模板类作为与完全专业函数的参数
- C++ 17 可以处理嵌套的可变参数模板吗?
- 带有可变参数的嵌套宏在GCC中编译,但在MSVC中不编译
- 在C++中使用模板类的嵌套类作为模板模板参数
- 如何使用variadic参数包的嵌套模板类
- 如何在variadic模板中采用嵌套参数包
- 传递具有依赖嵌套参数类型的模板模板参数时出错
- 可变参数嵌套循环