Em C++, você pode ter uma função que modifique uma tupla de comprimento variável?

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Em C++0x eu gostaria de escrever uma função como esta:

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

Eu primeiro tentei usar um loop for em int i e então faça:

get<i>(my_tuple);

E então armazene algum valor no resultado.No entanto, get só funciona em constexpr.

Se eu pudesse tirar as variáveis ​​do tuple e passá-los para uma função de modelo variável, eu poderia recorrer aos argumentos com muita facilidade, mas não tenho ideia de como tirar as variáveis ​​da tupla sem get.Alguma ideia de como fazer isto?Ou alguém tem outra maneira de modificar isso tuple?

Foi útil?

Solução

Já que o "i" em

get<i>(tup)

precisa ser uma constante em tempo de compilação, a instanciação do modelo é usada para "iterar" (na verdade, recursivamente) através dos valores.As tuplas de reforço têm as metafunções "comprimento" e "elemento" que podem ser úteis aqui - presumo que o C++ 0x também as tenha.

Outras dicas

Boost.Fusão vale a pena dar uma olhada.Ele pode 'iterar' std::pair, boost::tuple, alguns outros contêineres e seus próprios tipos de tupla, embora eu não ache que ele suporte std::tuple ainda.

AFAICT, tuplas C++ basicamente precisam ser tratadas com recursão;não parece haver nenhuma maneira real de empacotar/descompactar tuplas exceto usando o único tratamento de modelos variados do sistema de tipos.

Dê uma olhada na seção 6.1.3.4 do TR1, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

get é definido para tuplas qualificadas const e não const e retorna o tipo de referência apropriado.Se você alterar sua declaração de função para o seguinte:

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

Então, o argumento para sua função é uma tupla não const e get permitirá que você faça as atribuições necessárias depois de escrever a iteração usando as informações fornecidas nas respostas anteriores.

Dê uma olhada na minha resposta aqui para obter um exemplo de recursão de modelo para desenrolar argumentos de tupla para uma chamada de função.

Como faço para expandir uma tupla em argumentos de função de modelo variado?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top