¿Cuáles son las ventajas de auto en los parámetros de la plantilla que (posiblemente) se introdujo con C++17?

Es simplemente una extensión natural de auto cuando quiero crear una instancia de código de plantilla?

auto v1 = constant<5>;      //v1 == 5, decltype(v1) is int
auto v2 = constant<true>;   //v2 == true, decltype(v2) is bool
auto v3 = constant<'a'>;    //v3 == 'a', decltype(v3) is char

¿Qué otra cosa puedo obtener de esta característica del lenguaje?

  • Como Información adicional Declarar la no-tipo de argumentos de plantilla con auto
  • Cada ahora y entonces veo a preguntas como este o este o este en StackOverflow. template < auto > hará que estos askers feliz.
  • Yo pensaba que el principal adelgaza fue std::vector<auto> v{1,2,3,4,5}; y cosas difíciles como la que se puede llamar de tipos como plantilla args (esp lambdas).
  • No, no es eso lo que hace. El auto va en la definición, no es el punto de uso.
  • esa es una función independiente que forma parte de los Conceptos de TS, pero no en C++17. El p0127 uso de auto no entre en conflicto con ella, aunque.
InformationsquelleAutor Damian | 2016-06-25

3 Comentarios

  1. 57

    La template <auto> característica (P0127R1) fue aceptado en C++ en la ISO C++ 2016 reunión en la ciudad de Oulu, Finlandia.

    Un auto palabra clave en un parámetro de plantilla puede ser utilizado para indicar un no-tipo de parámetro del tipo de la que se deduce en el momento de creación de instancias. Ayuda a pensar en esto como una forma más cómoda de escribir:

    template <typename Type, Type value>

    Por ejemplo,

    template <typename Type, Type value> constexpr Type constant = value;
    constexpr auto const IntConstant42 = constant<int, 42>;

    ahora puede ser escrito como

    template <auto value> constexpr auto constant = value;
    constexpr auto const IntConstant42 = constant<42>;

    donde usted no necesita deletrear explícitamente el tipo más. P0127R1 también incluye algunos simples pero buenos ejemplos donde el uso de template <auto> con variadic los parámetros de la plantilla es muy útil, por ejemplo para las implementaciones de tiempo de compilación de listas de valores constantes:

    template <auto ... vs> struct HeterogenousValueList {};
    using MyList1 = HeterogenousValueList<42, 'X', 13u>;
    
    template <auto v0, decltype(v0) ... vs> struct HomogenousValueList {};
    using MyList2 = HomogenousValueList<1, 2, 3>;

    En pre-C++1z, mientras que HomogenousValueList podría ser escrito simplemente como

    template <typename T, T ... vs> struct Cxx14HomogenousValueList {};
    using MyList3 = Cxx14HomogenousValueList<int, 1, 2, 3>;

    escribir un equivalente de HeterogenousValueList no sería posible sin la envoltura de los valores en algunas otras plantillas, por ejemplo:

    template <typename ... ValueTypes> struct Cxx14HeterogenousValueList {};
    using MyList4 = Cxx14HeterogenousValueList<constant<int, 42>,
                                               constant<char, 'X'> >;
    • no-tipo de los parámetros de la plantilla no puede ser cualquier cosa, algo así como la constante<3.0> no funciona. Tanto para el código genérico.
    • Una posible solución sería el uso de std::ratio en lugar de los valores de punto flotante y convertirlos en reales los valores de punto flotante más tarde cuando sea necesario.
  2. 11

    De hecho, el caso de los valores reales en mceo del (original) respuesta es explícitamente no cubiertos como no-tipo de parámetro de plantilla.

    template <auto ... vs> struct HeterogenousValueList {};
    using MyList1 = HeterogenousValueList<42, 'X', 1.3f>;

    Ver el ejemplo dado en la mencionada propuesta:
    Modificar §14.3.2 párrafo 2:

    template<auto n> struct B { /* ... */ };
    B<5> b1;   //OK: template parameter type is int
    B<'a'> b2; //OK: template parameter type is char
    B<2.5> b3; //error: template parameter type cannot be double

    Tropecé con la misma idea errónea de mí mismo hace un par de días.

    • Si bien esto es bueno saber, y upvoted, por ahora, no veo por qué es relevante para la cuestión. Nadie es ahora lo que sugiere valores reales pueden ser usados como no-tipo de los parámetros de la plantilla.
    • Esta fue una respuesta a la respuesta original de mceo, donde dio un ejemplo de un valor real como argumento de plantilla, que, sin embargo, no está permitido. Este aspecto se incluye ahora en el aceptado respuesta anterior después de ser editado, y ahora es esencialmente redundante.
    • Y es relevante para la cuestión en el sentido de que la introducción de ‘auto’ no colarse en la nueva plantilla tipos de argumento como uno puede conseguir fácilmente la impresión de.
  3. 4

    Aquí es otro ejemplo (originalmente presentado por @Rakete1111 como una respuesta para plantilla plantilla parámetro de tipo desconocido):

    Extraer el valor de TAMAÑO sin conocer su tipo:

    template<std::size_t SIZE>
    class Foo {};
    
    template <template<auto> class T, auto K>
    auto extractSize(const T<K>&) {
        return K;
    }
    
    int main() {
        Foo<6> f1;
        Foo<13> f2;
        std::cout << extractSize(f1) << std::endl;
        std::cout << extractSize(f2) << std::endl;
    }

Dejar respuesta

Please enter your comment!
Please enter your name here