6

我有以下代码:

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

4

2 回答 2

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)
{...}
于 2012-11-15T03:53:45.167 回答
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

这样做的好处是您可以明确地处理您想要的每个实例,同时如果您错过了一个会生成编译错误。

于 2012-11-15T03:29:56.597 回答