我试图做一些花哨的模板,我偶然发现了一个问题:在定义一个非静态成员时,我希望在其定义中获得类的类型。这可能吗? (在任何C ++版本中。)
请使用以下代码:
template<typename T>
struct inner {
T* this_;
/* fancy stuff... */
};
struct foo {
inner<foo> bar{this};
};
类foo
具有使用指针bar
初始化的非静态成员foo* this
。这段代码用clang和gcc编译。
但实际上我希望inner
的定义出现在宏中,这意味着我没有在行foo
中使用字符串inner<foo> bar{this}
。试图使用:
inner bar{this};
在C ++ 17中,允许对类模板进行模板参数推导,产生错误
我明白了。尝试:错误:使用课程模板&#39;内部&#39;需要模板参数;非静态结构成员
中不允许使用参数推导inner bar{this};
inner<decltype(*this)> bar{this};
产生类似的错误:
错误:无效使用&#39;这个&#39;在非静态成员函数
之外inner<decltype(*this)> bar{this};
作为一种解决方法,我一直在使用以下奇怪的重复模板模式:
template<typename T>
struct SelfAwareType {
using myOwnType = T;
}
struct foo : SelfAwareType<foo> {
inner<myOwnType> bar{this};
};
答案 0 :(得分:1)
如果您可以限制所有foo要求typedef&#39; this_type&#39;然后你的宏可以不需要指定foo。
template<typename T>
struct inner {
T* this_;
/* fancy stuff... */
};
struct foo {
typedef foo this_type ;
inner<this_type> bar{this};
};
与您的解决方法基本相同&#39;无需使用crtp并引入其他类型。