得到"这个"在C ++中定义非静态成员时

时间:2018-05-25 19:17:57

标签: c++ templates types

我试图做一些花哨的模板,我偶然发现了一个问题:在定义一个非静态成员时,我希望在其定义中获得类的类型。这可能吗? (在任何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};
};

1 个答案:

答案 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并引入其他类型。