模板定义与" struct structname< ..>"是正确的?

时间:2017-07-20 08:51:40

标签: c++

此代码来自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;,它会影响任何内容吗?

2 个答案:

答案 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 {
  // ...
};

你引用的那个提供了专门的版本。当_Typevoid时,结果类将根据您的问题定义(根据剩余的两个参数)。

  

在上面的例子中,&#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中使用表达式。