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…>
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++(entrada)… };
// plantilla primaria
template <typename… objetos=””>
std::tuple<objetos…> convertir_a_datos(const std::string_view& entrada) {
return std::tuple<objetos…>{ internal::extraerSiguiente
}
// 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);
}
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…>