这个C模板宏是什么意思?

有人可以帮我解决这个问题吗?我知道宏,我对模板非常熟悉,但我不知道作者用这个表达了什么.什么是预期用途,为什么这样写?我们在这里定义的是什么?如何以及为何使用此功能
#define MY_CLASS(RET_TYPE,... )\
    template<typename Derived>\
    __VA_ARGS__\
    RET_TYPE my_class_impl<Derived>

我也有类似的东西

MY_CLASS( )::my_class_impl( int arg_id )

我也看到了

template<typename Derived>
class my_class_impl

我从一位同事那里听说这是CRTP的案例(好奇地反复出现模板模式),但他没有更具体的见解.

另外,我看到它随后如下使用:

MY_CLASS(some_type)::find_desired_val(int x) {
// some code
}

那么,在实际实现它们时,宏用于替换类my_class_impl的方法签名?

解决方法

它用于定义my_class_impl< Derived>的成员函数.
MY_CLASS(void)::member(Bar b) {}

扩展到:

template <typename Derived>
void my_class_impl<Derived>::member(Bar b) {}

可变参数宏参数可用于各种(标准或非标准)属性,例如__declspec(...),[[...]]等.例如:

MY_CLASS(void,__declspec(dllexport))::foo();

扩展到:

template <typename Derived>
__declspec(dllexport) void my_class_impl<Derived>::foo() {}

MY_CLASS():: my_class_impl(int arg_id),感谢编译器扩展允许缺少宏参数(存在于MSVC上,以及Clang和GCC,我错了),扩展为构造函数

template <typename Derived>
/* nothing */ my_class_impl<Derived>::my_class_impl(int arg_id) {}

这也是一个非常丑陋的宏.它不仅难以理解,它隐藏了非常平凡的东西,并且如果您尝试返回包含逗号的类型(std :: map< int,int>)则会中断.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...