如何使用模板重载明确引用函数

时间:2014-07-08 15:01:09

标签: c++

假设我有以下定义:

int f(int ) { return 1; } // a)

template<typename T> int f(T x) { return 2; } // b)

我理解,如果我致电f,例如f(1),非模板重载a)将是首选,但是有没有办法明确地引用a)?例如,我可以使用f<int>明确地引用b)。

作为为什么这会有用的一个例子,请考虑以下函数:

template<typename Func, typename T> void print_result(Func f, T arg) 
{ 
   std::cout << f(arg) << std::endl; 
}

如果我尝试在f上使用它,例如print_result(f,1),我会收到编译错误(编译器不知道我的意思是f)。我可以使用print_result(f<int>,1)告诉它使用b),但是如何告诉它使用a)?

我发现我可以使用print_result(static_cast<int (*)(int)>(f), 1),但这会让人感到烦恼并且很麻烦。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

使用模板专业化:

template<>
int f<int>(int x ) { return 1; } // a)