ejemplo descargar c++ templates auto c++17

ejemplo - c++17 descargar



Ventajas de auto en parĂ¡metros de plantilla en C++ 17 (3)

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

¿Es solo una extensión natural de auto cuando quiero crear una instancia del 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é más obtengo de esta función de idioma?


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

Extrayendo el valor de SIZE 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; }


En realidad, el caso de los valores reales en la respuesta de mceo (original) no se cubre explícitamente como parámetro de plantilla sin tipo.

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

Ver el ejemplo dado en la propuesta mencionada: 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

Me tropecé con el mismo error hace unos días.


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

Se puede usar una palabra clave auto en un parámetro de plantilla para indicar un parámetro que no es de tipo cuyo tipo se deduce en el punto de instanciación. Es útil pensar en esto como una forma más conveniente 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 se puede escribir como

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

donde ya no necesita deletrear explícitamente el tipo. P0127R1 también incluye algunos ejemplos simples pero buenos donde el uso de la template <auto> con parámetros de plantilla variadic es muy útil, por ejemplo, para implementaciones de listas de tiempo de compilación 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 escribirse 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 ajustar los valores en algunas otras plantillas, por ejemplo:

template <typename ... ValueTypes> struct Cxx14HeterogenousValueList {}; using MyList4 = Cxx14HeterogenousValueList<constant<int, 42>, constant<char, ''X''> >;