我想重载一个函数,以便它以某种方式操纵其参数,然后返回对该参数的引用——但如果参数不可变,那么它应该返回参数的操纵副本。在搞砸了很久之后,这就是我想出的。
using namespace std;
string& foo(string &in)
{
in.insert(0, "hello ");
return in;
}
string foo(string &&in)
{
return move(foo(in));
}
string foo(const string& in)
{
return foo(string(in));
}
这段代码似乎工作正常,但我很想知道是否有人能想出更好的方法来做到这一点。
这是一个测试程序:
int main(void)
{
string var = "world";
const string var2 = "const world";
cout << foo(var) << endl;
cout << var << endl;
cout << foo(var2) << endl;
cout << var2 << endl;
cout << foo(var + " and " + var2) << endl;
return 0;
}
正确的输出是
hello world
hello world
hello const world
const world
hello hello world and const world
我想如果我能做到这一点会稍微整洁一些:
string& foo(string &in)
{
in.insert(0, "hello ");
return in;
}
string foo(string in)
{
return move(foo(in));
}
当然,这是行不通的,因为大多数函数调用foo
都是模棱两可的——包括调用foo
本身!但是如果我能以某种方式告诉编译器优先考虑第一个......
正如我所说,我发布的代码可以正常工作。我不喜欢的主要是重复的额外代码。如果我有一堆这样的函数,它会变得一团糟,而且大部分都是非常重复的。所以作为我问题的第二部分:任何人都可以想出一种方法来自动生成第二个和第三个foo
函数的代码吗?例如
// implementation of magic_function_overload_generator
// ???
string& foo(string &in);
magic_function_overload_generator<foo>;
string& bar(string &in);
magic_function_overload_generator<bar>;
// etc