En C++, ¿puedes tener una función que modifique una tupla de longitud variable?

StackOverflow https://stackoverflow.com/questions/80348

  •  09-06-2019
  •  | 
  •  

Pregunta

En C++ 0x me gustaría escribir una función como esta:

template <typename... Types>
void fun(typename std::tuple<Types...> my_tuple) {
    //Put things into the tuple
}

Primero intenté usar un bucle for en int i y luego haz:

get<i>(my_tuple);

Y luego almacene algún valor en el resultado.Sin embargo, get solo funciona en constexpr.

Si pudiera sacar las variables del tuple y pasarlos a una función con plantilla variada que podría recurrir a los argumentos muy fácilmente, pero no tengo idea de cómo sacar las variables de la tupla sin get.¿Alguna idea sobre cómo hacer eso?¿O alguien tiene otra forma de modificar esto? tuple?

¿Fue útil?

Solución

Desde la "i" en

get<i>(tup)

debe ser una constante en tiempo de compilación, la creación de instancias de plantilla se utiliza para "iterar" (en realidad, recursar) a través de los valores.Las tuplas de impulso tienen las metafunciones de "longitud" y "elemento" que pueden ser útiles aquí; supongo que C++ 0x también las tiene.

Otros consejos

Impulso.Fusión vale la pena echarle un vistazo.Puede 'iterar' std::pair, boost::tuple, algunos otros contenedores y sus propios tipos de tuplas, aunque no creo que sea compatible std::tuple todavía.

AFAICT, las tuplas de C++ básicamente deben manejarse con recursividad;No parece haber ninguna forma real de empaquetar/desempaquetar tuplas. excepto utilizando el único manejo de plantillas variadas del sistema de tipos.

Eche un vistazo a la sección 6.1.3.4 de TR1, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

get se define para tuplas calificadas constantes y no constantes y devuelve el tipo de referencia apropiado.Si cambia su declaración de función a lo siguiente:

template 
void fun(typename std::tuple& my_tuple) {
    //Put things into the tuple
}

Entonces el argumento de su función es una tupla no constante y get le permitirá realizar las asignaciones necesarias una vez que haya escrito la iteración utilizando la información proporcionada en las respuestas anteriores.

Eche un vistazo a mi respuesta aquí para ver un ejemplo de recursividad de plantilla para desenredar argumentos de tupla en una llamada de función.

¿Cómo amplío una tupla en argumentos de función de plantilla variada?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top