"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como armazenar objetos heterogêneos em contêineres C++: boost::any ou implementação personalizada?

Como armazenar objetos heterogêneos em contêineres C++: boost::any ou implementação personalizada?

Publicado em 2024-11-08
Navegar:997

 How to Store Heterogeneous Objects in C   Containers: boost::any or Custom Implementation?

Armazenando objetos heterogêneos em contêineres C

Contêineres C normalmente requerem elementos homogêneos, o que significa que eles só podem conter objetos de um único tipo. No entanto, há situações em que você pode precisar de um contêiner que possa acomodar uma combinação de tipos de dados. Este artigo explora como conseguir isso usando a biblioteca boost::any e uma abordagem personalizada.

Usar boost::any

boost::any é uma classe de modelo que pode conter qualquer tipo C. Ao armazenar instâncias de boost::any em um contêiner, você pode ter uma coleção heterogênea de objetos. Essa abordagem é recomendada por sua robustez e tratamento de casos extremos.

Implementação personalizada

Se preferir uma abordagem mais manual, você pode criar uma estrutura ou união personalizada que combina membros de todos os tipos esperados junto com um indicador para especificar o tipo ativo.

Abordagem de estrutura:

struct HeterogeneousContainer {
  int i;
  std::string s;
  double d;
  int type; // 0 for int, 1 for string, 2 for double
};

Abordagem Union (use com cautela):

union HeterogeneousContainer {
  int i;
  std::string s;
  double d;
};

No entanto, essa abordagem tem limitações e possíveis armadilhas, como:

  • Os sindicatos permitem apenas um membro ativo por vez.
  • Lendo um membro inativo pode resultar em comportamento indefinido.
  • É necessário um manuseio cuidadoso para garantir que o tipo correto seja especificado e acessado.

Conclusão

Ao enfrentar a necessidade de armazenar objetos heterogêneos em um contêiner C, considere usar a biblioteca boost::any para sua segurança e eficácia. Se desejar, uma implementação personalizada pode ser criada usando uma estrutura ou união, mas esteja atento às suas limitações.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3