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

Bar*_*ich 6 c++ macros templates variadic-functions c++14

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

#define MY_CLASS(RET_TYPE, ... )\
    template<typename Derived>\
    __VA_ARGS__\
    RET_TYPE my_class_impl<Derived>
Run Code Online (Sandbox Code Playgroud)

我也有类似的东西

MY_CLASS( )::my_class_impl( int arg_id )
Run Code Online (Sandbox Code Playgroud)

我也看到了

template<typename Derived>
class my_class_impl
Run Code Online (Sandbox Code Playgroud)

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

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

MY_CLASS(some_type)::find_desired_val(int x) {
// some code
}
Run Code Online (Sandbox Code Playgroud)

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

Que*_*tin 10

它用于定义成员函数my_class_impl<Derived>.

MY_CLASS(void)::member(Bar b) {}
Run Code Online (Sandbox Code Playgroud)

扩展到:

template <typename Derived>
void my_class_impl<Derived>::member(Bar b) {}
Run Code Online (Sandbox Code Playgroud)

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

MY_CLASS(void, __declspec(dllexport))::foo();
Run Code Online (Sandbox Code Playgroud)

扩展到:

template <typename Derived>
__declspec(dllexport) void my_class_impl<Derived>::foo() {}
Run Code Online (Sandbox Code Playgroud)

所述MY_CLASS()::my_class_impl(int arg_id),由于编译器扩展,它允许丢失宏参数(存在于MSVC,以及铛和GCC,我错),扩展为一个构造:

template <typename Derived>
/* nothing */ my_class_impl<Derived>::my_class_impl(int arg_id) {}
Run Code Online (Sandbox Code Playgroud)

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