Sobrecarga de función rvalue

Quiero sobrecargar una función para que manipule su argumento de alguna manera y luego devuelva una referencia al argumento - pero si el argumento no es mutable, entonces debería devolver un manipuló copia del argumento en su lugar. Después de jugar con él durante años, esto es lo que se me ocurrió:

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));
}

Este código parece funcionar correctamente, pero me interesa saber si alguien puede pensar en una manera mejor de hacerlo.

Aquí hay un programa de prueba:

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;
}

La salida correcta es

hello world
hello world
hello const world
const world
hello hello world and const world

Supongo que sería un poco más ordenado si pudiera hacer esto:

string& foo(string &in)
{
    in.insert(0, "hello ");
    return in;
}

string foo(string in)
{
    return move(foo(in));
}

Por supuesto, eso no funciona porque la mayoría de las funciones llaman a foo sería ambiguo, ¡incluida la llamada en foo en sí! Pero si de alguna manera pudiera decirle al compilador que priorice el primero ...

Como dije, el código que publiqué funciona correctamente. Lo principal que no me gusta es el código extra repetitivo. Si tuviera un montón de funciones como esa, se convertiría en un desastre, y la mayoría sería muy repetitiva. Entonces, como segunda parte de mi pregunta: ¿alguien puede pensar en una forma de generar automáticamente el código para la segunda y tercera funciones foo ? por ejemplo,

// 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
задан karadoc 16 June 2011 в 07:51
поделиться