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

What does this C++ template macro mean?

有人可以帮我分解一下吗?我知道宏,我对模板相当熟悉,但我不知道作者用这个表达什么。用途是什么,为什么要这样写?我们在这里定义什么?如何以及为什么使用它?

#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
}

那么,在实际实现时,宏是用来代替 class my_class_impl 的方法签名的吗?

RET_TYPE 暗示这是一个函数,MY_CLASS 特别暗示成员函数。这些也可以声明为 static

不太常见的是 [[noreturn]][[deprecated]],它们是 C++14 属性。

<Derived> 部分与此无关,class 模板可以像 classes 一样拥有成员函数。

用于定义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) {}

也是一个比较丑的宏。它不仅难以理解,而且隐藏了非常平凡的东西,如果您尝试 return 包含逗号 (std::map<int, int>).

的类型,它就会中断