Mi idea de la característica de C++17 Deducción de parámetros de plantilla para clases plantilla era que se pretendía homogeneizar el comportamiento de las funciones plantilla y las clases plantilla en los casos de deducción de parámetros. Pero creo que hay algo que no he entendido.
Si tenemos este objeto 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]{};
};
Habitualmente uso una función de ayuda para facilitar la creación de objetos test
:
template <std::size_t S, typename T>
test<S, T> helper(T (&input)[S]) { return input; }
Que puede ser usada de la siguiente manera:
int main()
{
int buffer[5];
auto a = helper<5, int>(buffer); // Sin deduccion.
auto b = helper<5>(buffer); // Tipo deducido.
auto c = helper(buffer); // Tipo y tamanyo deducidos.
std::cout << a.size << b.size << c.size;
return 0;
}
El código anterior muestra 555
como era de esperar. He probado lo mismo en Wandbox usando los compiladores más nuevos1:
int main()
{
int buffer[5];
test<5, int> a(buffer); // Sin deduccion: Funciona.
test<5> b(buffer); // Tipo deducido: FALLO.
test c(buffer); // Tipo y tamanyo deducidos: Funciona.
std::cout << a.size << b.size << c.size;
return 0;
}
Parece que la deducción de parámetros para clases plantilla sólo funciona cuando se deducen todos los parámetros, estaba esperando que ambos comportamientos (la deducción por función y por clase) fueran iguales, ¿hay algo que no haya entendido?
1Los últimos compiladores disponibles en Wandbox son gcc HEAD 7.0.1 201701 y clang HEAD 5.0.0 (trunk).