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