, Если кто-нибудь знает как, смело редактируйте / добавляйте в мой пост.
у перегрузить функцию, чтобы она каким-то образом манипулировала своим аргументом и затем возвращала ссылку на аргумент - но если аргумент не является изменяемым, то он должен возвращать манипулированныйкопия аргумента вместо. После того, как возиться с ним целую вечность, вот что я придумал.
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