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