这个 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>
).
的类型,它就会中断
有人可以帮我分解一下吗?我知道宏,我对模板相当熟悉,但我不知道作者用这个表达什么。用途是什么,为什么要这样写?我们在这里定义什么?如何以及为什么使用它?
#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>
).