7

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).

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Hace mucho que no trabajo que c++ ademas no cuento con la experiencia c++17 para responder a tu pregunta, pero quizas este link te ayude a comprender http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0091r3.html, en el apartado h2 The Solution si no quieres o no puedes leer todo quizas te ayude a saber si es lo que buscas. – Angel Angel Feb 13 '17 at 23:31
  • ¿No es el mismo documento que enlazo en mi pregunta? ;) – PaperBirdMaster Feb 14 '17 at 07:47
  • Yo diría que sí... el enlace es el mismo – eferion Feb 14 '17 at 09:14
  • @PaperBirdMaster Creo que deberías hacer una colecta de las respuestas que te han hecho en la versión inglesa y publicar una respuesta... No sería correcto que lo hiciese yo después de haber puesto la recompensa – eferion Feb 14 '17 at 09:16
  • @eferion tampoco me parece correcto responder a mi propia pregunta y llevarme una recompensa por ello. – PaperBirdMaster Feb 14 '17 at 09:55
  • @PaperBirdMaster Al menos tu te has molestado en publicarla en otros sitios donde sí has podido obtener respuestas – eferion Feb 14 '17 at 10:17
  • @PaperBirdMaster Además no es por la recompensa, que la reputación es lo de menos, considero que la pregunta es importante que tenga respuesta... – eferion Feb 14 '17 at 10:18
  • PaperBirdMaster disculpa fallo mio, si es cierto que es el mismo, simplemente al leer la pregunta me parecio interesante y me centre durante un momento en el codigo que pusistes que me olvide de mirar el link, antes de ponerme a buscar por google. @eferion Yo diría que sí... pues si tienes toda la razon – Angel Angel Feb 14 '17 at 20:01

1 Answers1

6

Las respuestas que se muestran a continuación están extraídas de la misma pregunta en SOen (Por favor, dad el crédito merecido a los autores originales).

Ambas respuestas vienen a decir que en el propio documento técnico no está claro que la deducción parcial de parámetros de plantilla en clases plantilla esté permitida y que se desestimó la deducción parcial por resultar confuso. Como podemos ver en los ejemplos de la pregunta la deducción total funciona.


Nicol Bolas

Parece haber una contradicción en el propio documento técnico de Deducción de parámetros de plantilla para clases plantilla; se indica que la especificación parcial de parámetros debería estar permitida (la traducción es mía, el resaltado de la respuesta original):

Proponemos que el nombre de plantilla pueda referirse a la clase plantilla como especificador-simple-de-tipo o con parámetros explícitamente proporcionados de manera parcial en dos contextos:

Pero en el texto del estándar sobre la misma propuesta no se proporciona una manera de tratar "parámetros explícitamente proporcionados de manera parcial".


metalfox

Extraído del informe del viaje1 de Botond Ballo:

Esta característica originalmente contenía dedución parcial, en que explicitamente se especificaban algunos de los parámetros de la plantilla, y se dejaba el resto para ser deducidos, pero se desestimó por la preocupación de que pudiera ser confuso en algunos casos:

// Deberia deducir tuple<int, string, float>,
// pero tuple<int> es un tipo correctamente formado por si mismo!
tuple<int> t(42, "waldo", 2.0f);

1Informe del viaje se refiere a que el autor del blog (Botond Ballo) partició en el encuentro del comité de estándares que tuvo lugar en Oulu en Junio de 2016. El autor del blog "There's Waldo!" informa de las convesaciones que pudo presenciar allí.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82