我有以下代码:
// 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
1}}和非{{1}}字符串配对?一个不要求我希望我没有错过一些论证类型的排列?
答案 0 :(得分:3)
感谢Mooing Duck的建议,这是我的解决方案:
// string specialization
void foo(const std::string &a, const std::string &b);
template<typename TA, typename TB>
typename std::enable_if<
std::is_constructible<std::string, TA>::value &&
std::is_constructible<std::string, TB>::value
>::type foo(TA a, TB b)
{
foo(std::string(std::move(a)), std::string(std::move(b)));
}
// generic implementation
template<typename TA, typename TB>
typename std::enable_if<
!std::is_constructible<std::string, TA>::value ||
!std::is_constructible<std::string, TB>::value
>::type foo(TA a, TB b)
{...}
答案 1 :(得分:0)
如果我理解你的目标,你可以做到这一点
template<typename T1,typename T2 >
void foo(T1, T2)
{
static_assert(sizeof(T1) == 0,"Did not overload all foo's");
}
template<>
void foo<const char *a, const char *b>()
{
... Handle this case
}
... ect ect ect
这样做的好处是,如果你错过了一个编译错误,你可以显式处理你想要的每个实例。