此代码来自C ++ STL v3.3 concept_checks.h,293-300:
template <class _Func, class _Arg>
struct _STL_UNARY_FUNCTION_ERROR<_Func, void, _Arg> {
static void
__unary_function_requirement_violation(_Func& __f,
const _Arg& __arg) {
__f(__arg);
}
};
C ++是否允许将模板定义为&#34; struct structname&lt; ..&gt;&#34;?
在上面的例子中,&#34;&lt; _Func,void,_Arg&gt;&#34;?的用途是什么?
如果我们删除&#34;&lt; _Func,void,_Arg&gt;&#34;,它会影响任何内容吗?
答案 0 :(得分:0)
C ++是否允许将模板定义为&#34; struct structname&lt; ..&gt;&#34;?
是的,C ++有这种语法。它定义了部分模板专业化。因此,有一个主_STL_UNARY_FUNCTION_ERROR
模板,其定义方式如下:
template <class _Func, typename _Type, class _Arg>
struct _STL_UNARY_FUNCTION_ERROR {
// ...
};
你引用的那个提供了专门的版本。当_Type
为void
时,结果类将根据您的问题定义(根据剩余的两个参数)。
在上面的例子中,&#34;&lt; _Func,void,_Arg&gt;&#34;是什么用途?
它指定在实例化模板时将选择此特化的参数。因此,只要第二种类型无效,这就是类的外观。
如果我们删除&#34;&lt; _Func,void,_Arg&gt;&#34;,它会影响任何内容吗?
是。这将使上面的模板重新定义。并且编译器需要拒绝它。结果是你的程序现在形成不良。
答案 1 :(得分:0)
这是模板(部分)专业化。当中间模板参数为void
在此之上会有一个像
这样的声明template <class _Func, class _Ret, class _Arg>
struct _STL_UNARY_FUNCTION_ERROR {
static _Ret
__unary_function_requirement_violation(_Func& __f,
const _Arg& __arg) {
return __f(__arg);
}
};
如果您删除了<_Func, void, _Arg>
,则会使用与之前模板名称相同的单独模板,并且您的程序格式错误。
请注意,_STL_UNARY_FUNCTION_ERROR<_Func, void, _Arg>
使用主要定义时,您的程序将会格式不正确,因为您无法在void函数的return
中使用表达式。