【问题标题】:Empty angle-brackets after a function's name in explicit specialization显式特化中函数名称后的空尖括号
【发布时间】:2019-06-26 11:24:03
【问题描述】:

这是来自文章Why not specialize function templates?的代码

template<class T>
void f(T);                     // (1)
template<class T>
void f(T*);                   // (2)
template<>
void f<>(int*);             // (3)

我的问题是关于最后的声明。该语法是什么意思?当我们想要完全特化一个函数模板时,例如(1)、对于某些我们通常写的类型:

template<>
void f<int>(int);

即我们将该类型放在函数名称后面的尖括号中。

那么语法(3)是什么意思?

【问题讨论】:

    标签: c++ templates template-specialization


    【解决方案1】:

    在你的情况下,

    template<> void f<>(int*);
    

    的显式特化
    template<class T> void f(T*); 
    

    基本模板。是一样的

    template<> void f<int>(int*);
    

    只推导出模板参数。


    你甚至可以写:

    template<> void f(int*);
    

    同样的效果。 cppreference 上也有类似的案例,请参阅 Explicit specializations of function templates 部分,其中写道:

    当特化函数模板时,如果模板实参推导可以从函数实参中提供模板实参,则可以省略其模板实参。

    C++ 标准的相关部分:http://eel.is/c++draft/temp.expl.spec#11

    【讨论】:

      【解决方案2】:

      如果您不提供模板参数,编译器将推导出它。在这种特殊情况下,它将被推断为int*,因为第二个模板更专业(但两者都是候选模板)。所以

      template<> void f<>(int*)
      

      会变成

      template<> void f<int>(int*)
      

      类型扣除后。

      【讨论】:

        猜你喜欢
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        • 2022-10-01
        • 2018-01-25
        • 2017-08-19
        • 2015-12-23
        • 1970-01-01
        相关资源
        最近更新 更多