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.
有任何想法吗?
您可以使用以下技巧:
#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函数.
| 归档时间: |
|
| 查看次数: |
3822 次 |
| 最近记录: |