【问题标题】:Templates vs Similar Non-Template Functions模板与类似的非模板函数
【发布时间】:2015-10-13 06:18:06
【问题描述】:

我创建了一个具有相同参数的模板专用函数和一个非模板函数。由于实际上两者都是相同的功能,我不确定 C++ 编译器将如何运行它,因为现在它有两个相同的功能,一个是专门的模板,另一个是非模板。我原以为这会导致编译器错误,因为编译器会找到两个具有相同参数和返回类型的函数(在本例中为 void foo(string) )。但看起来非模板版本是在调用它时执行的版本。 那么这样做有优先级吗?

如果我误解了,请告诉我。

代码:这将打印“字符串非模板”

#include <iostream>
#include <string>
using namespace std;

template<typename T>
void foo(T input)
{
    cout <<"Generic Template"<<endl;    
}

template<>
void foo<string>(string input)
{
    cout <<"String Template"<<endl;
}

void foo(string input)
{
    cout <<"String Non-Template"<<endl;
}

int main() {

    string input = "abc";
    foo(input);

    return 0;
}

【问题讨论】:

  • 请注意,您可以通过foo&lt;std::string&gt;(input); 调用模板版本(甚至foo&lt;&gt;(input);

标签: c++ templates


【解决方案1】:

常规函数总是优于函数模板,即使是函数模板的特化。

来自 C++ 标准:

13.3.3 最佳可行函数 [over.match.best]

1 如下定义ICSi(F):

...

鉴于这些定义,如果对于所有参数iICSi(F1) 的转换序列不比ICSi(F2) 差,并且那么

...

-- F1 是一个非模板函数,F2 是一个函数模板特化,或者,如果不是这样,

【讨论】:

  • @R Sahu - 谢谢!
  • @Invinsible,当然。我很高兴能够提供帮助。
猜你喜欢
  • 2011-06-07
  • 2010-12-20
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多