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

C++ 如何使用模板重载明确地引用函数,c++,C++,假设我有以下定义: int f(int ) { return 1; } // a) template<typename T> int f(T x) { return 2; } // b) 如果我试图在f上使用它,例如,print\u result(f,1),我会得到一个编译错误(编译器不知道我指的是哪个f)。我可以使用print\u结果(f,1)告诉它使用b),但我如何告诉它使用a) 我发现我可以使用打印结果(static\u cast(f),1),但这感觉很粗糙而且很麻烦。有更

假设我有以下定义:

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

template<typename T> int f(T x) { return 2; } // b)
如果我试图在
f
上使用它,例如,
print\u result(f,1)
,我会得到一个编译错误(编译器不知道我指的是哪个
f
)。我可以使用
print\u结果(f,1)
告诉它使用b),但我如何告诉它使用a)


我发现我可以使用
打印结果(static\u cast(f),1)
,但这感觉很粗糙而且很麻烦。有更好的方法吗?

使用模板专门化:

template<>
int f<int>(int x ) { return 1; } // a)
模板
intf(intx){return 1;}//a)

“我发现我可以使用
打印结果(static\u cast(f),1)
”这实际上是选择重载集函数的常用方法。您也可以使用
[](int p){return f(p);}
或在C++1y中,
[](auto&&p)->decltype(auto){return f(std::forward(p));}
代替
静态转换
,您还可以使用隐式转换:
打印结果(f,1)@dyp我在使用c++11标准的VS2013下对其进行了测试,对吗?@herohuyongtao VS2013试图在大多数部分与c++11兼容(禁用语言扩展时);但它的功能还不完整,并且已知它不完全符合要求(例如,依赖名称查找和角案例)。你有没有试过我在VS2013中的真实例子?@dyp和@PaulEvans,谢谢你们在这里指出我的误解。我想我应该简单地说:“
print_result(f,1)
在VS2013中工作(调用a),正如预期的那样)”,但不确定原因:谢谢你的回答,但它并没有真正回答我的问题。如果我没有重新定义函数的自由呢?我总是可以定义包装器函数(或dyp在对问题的评论中建议的lambda),但我希望有一种更简洁的方法。虽然这确实解决了问题,但通常不希望专门化函数模板(请参阅)
template<>
int f<int>(int x ) { return 1; } // a)