【发布时间】:2015-10-20 07:36:07
【问题描述】:
我想编写一个宏,当在一个类中展开时,它使用该类类型(特别是作为模板参数)。在类方法中,我可以使用这个:
#define METHOD_MACRO int sample_method(void)const {\
return template_struct<this_type<decltype(this)>::type>::index;}
(this_type 是我的结构体,这里相当于remove_pointer<remove_const<T>>)
但是当我需要方法之外的类类型时(对于类成员指针的 typedef),this 关键字不可用;我尝试使用auto 进行一些推断类型的技巧,但这里没有运气。
有问题的类是从我的类继承的,如果这有帮助的话。我想避免任何使用我的宏的人都必须写typdedef。
有什么想法吗?
【问题讨论】:
-
使用 CRTP?也许您可以完全消除宏...
-
这需要用户做出明确的努力,我尽量避免。有趣的想法,但还不够。
-
@Abstraction 键入宏的名称需要用户做出的明确努力,而不是从具有 CRTP 的类继承:)
-
@Drax 仍然存在覆盖虚函数的问题,但是是的,这是可能的解决方案(并且比要求“typedef Class self”等更优雅)。这对用户来说没有多大意义——必须像这样写两次类名。
-
@Petr - 是的,它是一样的。搜了一下没找到,不好意思。不过,感谢您的帮助 - 即使您的解决方案依赖于编译器,这可能就足够了。