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

What does this C++ template macro mean?

本文关键字:是什么 意思 c++ 这个      更新时间:2023-10-16

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

#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>)的类型,它就会中断。

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

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

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