假设我有以下定义:
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)
,但这会让人感到烦恼并且很麻烦。还有更好的方法吗?
答案 0 :(得分:1)
使用模板专业化:
template<>
int f<int>(int x ) { return 1; } // a)