我想重载一个函数,以便它以某种方式操纵它的参数,然后返回对该参数的引用 - 但如果参数不可变,那么它应该返回一个被操纵的copy相反。
经过多年的摸索之后,这就是我想到的。
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