, Если кто-нибудь знает как, смело редактируйте / добавляйте в мой пост.

у перегрузить функцию, чтобы она каким-то образом манипулировала своим аргументом и затем возвращала ссылку на аргумент - но если аргумент не является изменяемым, то он должен возвращать манипулированныйкопия аргумента вместо. После того, как возиться с ним целую вечность, вот что я придумал.

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

Ответы на вопрос(5)

Ваш ответ на вопрос