参见英文答案 >
How do I avoid implicit conversions on non-constructing functions?7个
我有一个功能:
我有一个功能:
void foo(int n) { std::cout << "foo(int)\n"; }
可以使用不同的参数调用,可以是char,double,float等:
foo(123); // 1 foo('c'); // 2 foo(0.2); // 3 foo(0.2f); // 4 // ...
…但我想只允许int参数(文字或变量),以便2,3,4,……以上将是非法的.我目前的解决方案是删除那些重载:
void foo(char) = delete; void foo(float) = delete; void foo(double) = delete;
但是这个重载列表可能真的很长,并且总是有人可以编写一个隐式转换为int的类,这将允许以错误的方式使用我的int函数,所以我发现写(而不是长显式列表):
template<typename T> void foo(T) = delete;
按预期工作.
解决方法
您可以将static_assert与std :: is_same一起使用:
template<typename T> void foo(T i) { static_assert(std::is_same<T,int>::value,"Not int"); std::cout << "foo(int)\n"; }