C++ - 有没有办法获得具有不变语法的当前类类型?

Abs*_*ion 6 c++ templates c++11

我想编写一个宏,当在类中扩展时,使用该类类型(特别是作为模板参数).在类方法中,我可以使用这个:

#define METHOD_MACRO int sample_method(void)const {\
    return template_struct<this_type<decltype(this)>::type>::index;}
Run Code Online (Sandbox Code Playgroud)

(this_type是我的结构,在这里相当于remove_pointer<remove_const<T>>)

但是当我需要方法之外的类类型(对于类成员指针的typedef)时,this关键字不可用; 我试图用auto一些技巧来推断类型,但这里没有运气.有问题的类是从我的班级继承的,如果这可以有任何帮助.我想避免使用我的宏必须写强制性的任何人typdedef.

有任何想法吗?

Pet*_*etr 7

您可以使用以下技巧:

#define SELF \
    static auto helper() -> std::remove_reference<decltype(*this)>::type; \
    typedef decltype(helper()) self

struct A {
    SELF;
};
Run Code Online (Sandbox Code Playgroud)

我使用auto返回类型声明了一个辅助函数,它允许我decltype(*this)用作返回类型,不知道什么是类名.然后我可以使用decltype(helper())代码中的类类型.注意该函数必须是static,否则你不能使用它decltype.该函数也是声明的,未定义的; 这不应该是一个问题,因为你无论如何都不会打电话.(你可以为它添加一个空体,但它会引发一个函数没有的警告return.你仍然可以改变返回类型decltype(this)并返回nullptr.)

然后,您可以使用selftypedef进行进一步的声明,或者只是将宏更改为typedef而不是类本身,但需要更改.调整它以满足您的特殊需求.

UPD:这似乎是GCC的非标准行为.例如,ICC 即使在尾随返回类型中也不允许this使用static函数.

  • 为什么你可以在这种情况下使用`this`? (4认同)
  • 是的,这看起来像是gcc错误。 (2认同)