如何选择功能模板专业化?

时间:2015-01-16 13:21:30

标签: c++ templates

#include <iostream>
using namespace std;

template<typename T>
void fun(T  t)
{
    cout << "match T" << endl;
}

template<>
void fun(int const& t)
{
    cout <<"match int const & "<<endl;
}

int main(int argc, char* argv[])
{
    const int x =12;
    const int& y =x;
    fun(x); //why not the second?
    fun(y); //why?
    fun(4);//why?

    return 0;
}

Output:

match T
match T
match T

我们知道在函数模板重载解析后,编译器应该从所选的基函数模板中选择最佳匹配特化吗? 什么是规则?

2 个答案:

答案 0 :(得分:0)

这是两个不同的模板!

你想做的是

template<>
void fun<const int>(const int& t)
{
    cout << "match const int & " << endl;
}

注意两件事:

  1. 对于专门的功能,&lt;&gt;在函数名称
  2. 之后指定特殊化的运算符
  3. const typetype const原则上是两件不同的事情;当type是一个指针(它是一个常量指针还是一个指向常量的指针?)时,这会变得毛茸茸!
  4. 此外,正如评论已经指出的那样,没有充分的理由在这里使用模板。一个简单的重载函数就可以了。

答案 1 :(得分:0)

您可以在T = int const&时专门针对案例设置模板。但是,根据模板参数推导的规则,推导出int(并且实例化主模板)。

相反,通过编写int const&的非模板函数来重载。 (直接引用绑定具有完全匹配等级,因此应选择该功能。)