Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个C++;模板宏是什么意思?_C++_Templates_Macros_C++14_Variadic Functions - Fatal编程技术网

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) {}