Deducción parcial de plantilla de clase C ++ 17
Mi entendimiento sobre elDeducción de argumentos de plantilla para plantillas de clase La propuesta era homogeneizar el comportamiento de las funciones de plantilla y las clases de plantilla en contextos de deducción. Pero creo que he entendido mal algo.
Si tenemos este objeto de plantilla:
template <std::size_t S, typename T>
struct test
{
static constexpr auto size = S;
using type_t = T;
test(type_t (&input)[size]) : data(input) {}
type_t (&data)[size]{};
};
Tiendo a usar una función auxiliar comoazúcar sintáctica Para creartest
objetos:
template <std::size_t S, typename T>
test<S, T> helper(T (&input)[S]) { return input; }
Que se puede usar como se muestra a continuación:
int main()
{
int buffer[5];
auto a = helper<5, int>(buffer); // No deduction
auto b = helper<5>(buffer); // Type deduced
auto c = helper(buffer); // Type and size deduced
std::cout << a.size << b.size << c.size;
return 0;
}
El código anterior da salida555
como se esperaba. He intentado lo mismo en Wandbox usando la nueva configuración del compilador1:
int main()
{
int buffer[5];
test<5, int> a(buffer); // No deduction: Ok.
test<5> b(buffer); // Type deduced: FAILS.
test c(buffer); // Type and size deduced: Ok.
std::cout << a.size << b.size << c.size;
return 0;
}
Parece que la deducción de argumentos de plantilla para plantillas de clase solo funciona deduciendo todos los parámetros, esperaba que ambos comportamientos (función auxiliar y plantilla de clase) fueran iguales, ¿entendí mal algo?
1Los últimos compiladores disponibles en Wandbox songcc HEAD 7.0.1 201701 yclang HEAD 5.0.0 (tronco).