関数をオーバーロードして、何らかの方法で引数を操作してから引数への参照を返すようにしたいのですが、引数が変更可能でない場合は、代わりに引数の操作されたコピーを返す必要があります。何年もの間それをいじった後、これが私が思いついたものです。
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
それで、私の質問の2番目の部分として、2番目と3番目の関数のコードを自動的に生成する方法を誰かが考えることができますか?例えば
// 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