应该如何使用const / non-const参数进行重载?

时间:2012-11-15 01:14:45

标签: c++ c++11 overloading

我有以下代码:

// 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}}字符串配对?一个不要求我希望我没有错过一些论证类型的排列?

2 个答案:

答案 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

这样做的好处是,如果你错过了一个编译错误,你可以显式处理你想要的每个实例。