Plantillas de funciones frente a palabras clave automáticas

3 minutos de lectura

avatar de usuario
trozo grueso

Puede el auto palabra clave en C ++ 11 reemplazar plantillas de funciones y especializaciones? En caso afirmativo, ¿cuáles son las ventajas de usar funciones de plantilla y especializaciones en lugar de simplemente escribir un parámetro de función como auto?

template <typename T>
void myFunction(T &arg)
{
    // ~
}

contra

void myFunction(auto &arg)
{
    // ~
}

  • Hay una manera en C++ 14: auto myFunction = [](auto &arg) {...};

    – chris

    8 de agosto de 2013 a las 20:44

  • C++ 20 tendrá esta característica: void myFunction(auto &arg) {...}

    – Sadeq

    23 de noviembre de 2018 a las 5:59


avatar de usuario
Michael Goldshteyn

En una palabra, auto no se puede usar en un esfuerzo por omitir los tipos reales de argumentos de funciones, por lo tanto, quédese con las plantillas de funciones y/o las sobrecargas. auto se utiliza legalmente para deducir automáticamente los tipos de variables:

auto i=5;

Sin embargo, tenga mucho cuidado de entender la diferencia entre lo siguiente:

auto x=...
auto &x=...
const auto &x=...
auto *px=...; // vs auto px=... (They are equivalent assuming what is being 
              //                 assigned can be deduced to an actual pointer.)
// etc...

También se utiliza para tipos de retorno de sufijo:

template <typename T, typename U>
auto sum(const T &t, const U &u) -> decltype(t+u)
{
  return t+u;
}

  • es importante señalar que el modo automático funciona bien el 99 % de las veces, a veces hay que detenerse un segundo y pensar qué está haciendo realmente el modo automático stackoverflow.com/questions/12773257/… Los punteros pueden ser un caso crítico para el modo automático.

    – usuario2485710

    08/08/2013 a las 20:53


  • @ user2485710, agregó más información a mi respuesta según su comentario.

    –Michael Goldshteyn

    08/08/2013 a las 20:58

Puede el auto palabra clave en C ++ 11 reemplazar plantillas de funciones y especializaciones?

No. Hay propuestas para usar la palabra clave para este propósito, pero no está en C++ 11, y creo que C++ 14 solo lo permitirá para lambdas polimórficas, no para plantillas de funciones.

En caso afirmativo, ¿cuáles son las ventajas de usar funciones de plantilla y especializaciones en lugar de simplemente escribir un parámetro de función como auto.

Es posible que aún desee un parámetro de plantilla con nombre si desea hacer referencia al tipo; eso sería más conveniente que std::remove_reference<decltype(arg)>::type o lo que sea.

avatar de usuario
danés ahmed

Lo único que lo convierte en el auto palabra clave diferente de template es decir, no puedes hacer una clase genérica usando el auto palabra clave.

class B { auto a; auto b; }

Cuando crea un objeto de la clase anterior, le dará un error.

B b; // Give you an error because compiler cannot decide type so it can not be assigned default value to properties

Mientras que al usar una plantilla puede crear una clase genérica como esta:

template <class T> 

class B {
    T a;
};

void main() {
    B<int> b; //No Error
}

¿Ha sido útil esta solución?