C++ 这个C++;模板宏是什么意思?
谁能帮我把这个分解一下吗?我知道宏,我对模板也相当熟悉,但我不知道作者用这个来表达什么。它的预期用途是什么,为什么写成这样?我们在这里定义什么?如何以及为什么使用这个C++ 这个C++;模板宏是什么意思?,c++,templates,macros,c++14,variadic-functions,C++,Templates,Macros,C++14,Variadic Functions,谁能帮我把这个分解一下吗?我知道宏,我对模板也相当熟悉,但我不知道作者用这个来表达什么。它的预期用途是什么,为什么写成这样?我们在这里定义什么?如何以及为什么使用这个 #define MY_CLASS(RET_TYPE, ... )\ template<typename Derived>\ __VA_ARGS__\ RET_TYPE my_class_impl<Derived> 我也明白了 template<typename Derived
#define MY_CLASS(RET_TYPE, ... )\
template<typename Derived>\
__VA_ARGS__\
RET_TYPE my_class_impl<Derived>
我也明白了
template<typename Derived>
class my_class_impl
因此,在实际实现类时,宏用于将类的方法签名替换为类
my\u class\u impl
,RET\u TYPE
提示这是一个函数,my\u class
特别提示成员函数。这些也可以声明为静态的
不太常见的是[[noreturn]]
或[[deprecated]]]
,它们是C++14属性
部分与此无关,类模板可以像类一样具有成员函数。它用于定义我的类impl的成员函数
扩展到:
template <typename Derived>
void my_class_impl<Derived>::member(Bar b) {}
template <typename Derived>
__declspec(dllexport) void my_class_impl<Derived>::foo() {}
扩展到:
template <typename Derived>
void my_class_impl<Derived>::member(Bar b) {}
template <typename Derived>
__declspec(dllexport) void my_class_impl<Derived>::foo() {}
这也是一个相当丑陋的宏。它不仅很难理解,而且隐藏了非常普通的东西,如果你试图返回一个包含逗号的类型(std::map
),它就会崩溃。什么是my_class\u impl
?typename派生的
使它看起来像是宏中的CRTP。对于RET\u TYPE
和..
可以提供哪些合理的参数,以及为什么不使用任何参数调用宏,我不知道。@Quentin:\u decltype(dllexport)
浮现在脑海中。但那是一个MSVC++扩展。@MSalters噢。IIRC MSVC还有一个扩展,用于调用缺少参数的宏。另外,我认为这是一个合理的问题。OP看到了代码并试图理解它。鉴于它充其量是错综复杂的,我不认为有理由关闭它。非常感谢,这是有道理的。还有一个细节,如果VA_ARGS实际上代表几个额外的参数呢?那么如何扩展方法签名呢?你能提供具体的例子吗?@BaronYugovich补充了一个例子。是的,这是C++14。
MY_CLASS(void, __declspec(dllexport))::foo();
template <typename Derived>
__declspec(dllexport) void my_class_impl<Derived>::foo() {}
template <typename Derived>
/* nothing */ my_class_impl<Derived>::my_class_impl(int arg_id) {}