【发布时间】:2012-11-15 01:14:45
【问题描述】:
我有以下代码:
// string specializations
void foo(const char *a, const char *b);
void foo(const char *a, const std::string &b);
void foo(const std::string &a, const char *b);
void foo(const std::string &a, const std::string &b);
// generic implementation
template<typename TA, typename TB>
void foo(TA a, TA b)
{...}
问题在于这个测试用例:
char test[] = "test";
foo("test", test);
最终调用foo 的模板版本。显然,我可以使用非const 参数的各种混合添加更多重载,但我想知道:是否有更好的方法来重载foo,以便它专门针对所有const 和非const 成对的字符串?不需要我希望我没有错过一些参数类型的排列?
【问题讨论】:
-
char *test = "test"不是你应该做的事情。"test"是const char*. -
SFINAE 用于无法转换为
std::string的类型,或者简单地制作std::string并要求调用者进行转换 -
因为您也错过了
"test"的类型为const char[5],而不是const char*。 -
@jogojapan,从技术上讲,
"test"是const char[5]。 -
对不起,是的。当然,我的观点是
const(转换为const char*不是问题,而转换为char *是临界的,只有在类型转换规则中不推荐使用的例外情况下才有可能)。跨度>
标签: c++ c++11 overloading