这个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
}
所以,宏是用来替代类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>
部分与此无关,类模板可以像类一样具有成员函数。
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 线应该是什么意思
- "CID"在AT+HTTPPARA= "CID" ,1中是什么意思
- 表达式"b=(b-x)&x"是什么意思?
- 这个表达是什么意思?
- 此代码验证公式是什么意思?
- 跟踪日志中的T.11803()是什么意思?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- * 和 ** 在 C++ 函数声明中是什么意思?
- _T("xyz")是什么意思?
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 这行代码到底是什么意思?
- 在命名空间名称之前加上 :: 是什么意思?
- 从字符数组的元素中减去'a'是什么意思
- "friend"关键字在C++中是什么意思?
- 减法中的"0"是什么意思?
- 字符数组前面的加号是什么意思?
- 这里的字符串函数是什么意思