如何重载就地和复制字符串操作函数?
How to overload an in-place and a copying string manipulation functions?
我希望能够做到以下几点:
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
我该如何克服这个问题?
这个调用有问题:
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
参数的函数。您还可以确定您对 <<
运算符 returns a std::string
的调用不会修改您的字符串。
这可能不是您要找的东西,而是您的代码
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
时,这意味着 "change the string" 还是 "make a new string based on the given string"?你想在真正意义上故意模棱两可吗?
考虑在未来 1 年内阅读您的代码。当你看到对 str_manip
的调用时你会怎么想 - 这会改变它的参数吗?上一个问题的答案是否取决于上下文?
编写代码的目标是使其清晰,尤其是在像 C++ 这样的多范式语言中。所以,在我看来,只是不要做你正在考虑的超载。相反,制作 2 个不同的名称,例如
void frobnicate_str(std::string&) {...}
std::string get_frobnicated_str(std::string) {...}
我希望能够做到以下几点:
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
我该如何克服这个问题?
这个调用有问题:
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
参数的函数。您还可以确定您对 <<
运算符 returns a std::string
的调用不会修改您的字符串。
这可能不是您要找的东西,而是您的代码
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
时,这意味着 "change the string" 还是 "make a new string based on the given string"?你想在真正意义上故意模棱两可吗?
考虑在未来 1 年内阅读您的代码。当你看到对 str_manip
的调用时你会怎么想 - 这会改变它的参数吗?上一个问题的答案是否取决于上下文?
编写代码的目标是使其清晰,尤其是在像 C++ 这样的多范式语言中。所以,在我看来,只是不要做你正在考虑的超载。相反,制作 2 个不同的名称,例如
void frobnicate_str(std::string&) {...}
std::string get_frobnicated_str(std::string) {...}