如何重载就地和复制字符串操作功能?

时间:2018-11-13 18:58:01

标签: c++ overloading ambiguous-call

我希望能够执行以下操作:

std::cout << str_manip("string to manipulate");

以及

std::string str;
str_manip(str);
std::cout << str;

为此,我有两个功能

#include <string>

// copying
std::string str_manip(std::string str)
{
        // manipulate str
        return str;
}

// in-place
void str_manip(std::string& str)
{
        // manipulate str
}

但是它们会产生以下错误:

error: call of overloaded 'str_manip(std::__cxx11::string&)' is ambiguous

我该如何克服?

2 个答案:

答案 0 :(得分:1)

问题在于此呼叫:

std::string str;
str_manip(str);
std::cout << str;

编译器不知道要调用哪个版本的str_manip

您可以将功能更改为以下形式:

#include <string>

// copying
std::string str_manip(const std::string& str)
{
        std::string dup = str;
        // manipulate dup
        return dup;
}

// in-place
void str_manip(std::string& str)
{
        // manipulate str
}

现在,编译器知道模糊调用必须是采用非{const参数的函数。您还可以确保将std::string返回给<<运算符的调用没有修改您的字符串。

答案 1 :(得分:1)

这可能不是您想要的东西,而是您的代码

std::cout << str_manip("string to manipulate");

str_manip的参数不是string,而是const char*(实际上是一个数组,但可以转换为char指针)。您可以基于此进行超载。

std::string str_manip(const char* s)
{
    std::string str(s); // create str
    // manipulate str
    return str;
}

但是,让我们看一看大局。当您在代码中看到str_manip时,是否表示“更改字符串”或“根据给定的字符串创建新的字符串”?您是否想在真实含义上有矛盾之处?

考虑自己在未来一年内阅读代码。看到对str_manip的调用时,您会怎么想-这会改变其参数吗?前一个问题的答案是否取决于上下文?

编写代码的目的是使代码更清晰,尤其是在像C ++这样的多范式语言中。因此,我认为,请不要做您正在考虑的重载。而是使用两个不同的名称,例如

void frobnicate_str(std::string&) {...}
std::string get_frobnicated_str(std::string) {...}
相关问题