es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Especialización de una función de plantilla variádica para std::tuple como tipo de retorno.

Estoy implementando una función de plantilla que analiza una cadena y devuelve una tupla de objetos, como:

template <typename... objects="">
std::tuple<objects...> convert2data(const std::string_view& input) {
    return std::tuple<objects...>{ internal::popNext<objects>(input)... } ;
}

Uso:

auto data = convert2data<int, double="">("1, 0.01") ;

Especifico los tipos esperados como argumentos de la plantilla. Ahora me gustaría obtener los tipos “directamente” de un tipo de tupla con nombre, tal vez más conveniente para un usuario:

using MyData = std::tuple<int, double=""> ; // incluido desde algún encabezado
auto data = convert2data<mydata>("1, 0.01") ;
std::cerr << std::get<int>(data) ;
// o mejor
MyData data2 = convert2data("1, 0.01") ;

Estoy atascado en intentos de especificar una especialización para este caso, por ejemplo, este código

template <typename... objects,="" class=""></typename...><objects...>&>
std::tuple<objects...> convert2data(const std::string_view& input) {
    return convert2data<objects...>(input) ;
}

no se compila. ¿Hay alguna manera de definir tal especialización para una función de plantilla donde se utiliza el tipo de plantilla en el valor de retorno?</objects…></objects…></objects…></int,></int,></objects…></objects…></typename…>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de definir una especialización para una función de plantilla donde el tipo de plantilla se utiliza en el valor de retorno. Un enfoque es utilizar la especialización parcial. Aquí hay un ejemplo de implementación:

    “`c++
    // plantilla primaria
    template <typename… objetos=””>
    std::tuple<objetos…> convertir_a_datos(const std::string_view& entrada) {
    return std::tuple<objetos…>{ internal::extraerSiguiente(entrada)… };
    }

    // especialización parcial para el tipo de tupla con nombre
    template <typename… objetos=””>
    std::tuple<objetos…> convertir_a_datos(const std::string_view& entrada, const std::tuple<objetos…>&) {
    return convertir_a_datos<objetos…>(entrada);
    }

    // función de conveniencia que deduce el tipo de tupla con nombre
    template <typename… objetos=””>
    std::tuple<objetos…> convertir_a_datos(const std::string_view& entrada) {
    std::tuple<objetos…> objeto_dummy{};
    return convertir_a_datos(entrada, objeto_dummy);
    }


    En esta implementación, definimos una especialización parcial de `convertir_a_datos` que toma un argumento adicional de tipo `const std::tuple<objetos...>&`, que se utiliza para deducir los argumentos de plantilla. También definimos una función de conveniencia que deduce el tipo de tupla con nombre al crear un objeto dummy de ese tipo y pasarlo como argumento a la especialización parcial. Con esta implementación, puedes utilizar `convertir_a_datos` tanto con argumentos de plantilla como con tipos de tupla con nombre, de esta forma: ```c++ auto datos1 = convertir_a_datos<int, double="">("1, 0.01"); auto datos2 = convertir_a_datos(std::tuple<int, double="">{}, "1, 0.01"); std::cerr << std::get<int>(datos2); // o mejor auto datos3 = convertir_a_datos<misdatos>("1, 0.01");

    Ten en cuenta que la especialización parcial debe venir después de la definición de la plantilla primaria en el código, y que el tipo de tupla con nombre debe pasarse como primer argumento en la llamada a la función de conveniencia.</int,></int,></objetos…></objetos…></objetos…></typename…></objetos…></objetos…></objetos…></typename…></objetos…></objetos…></typename…>

Comments are closed.