Pergunta

Eu preciso armazenar uma série de dados na forma de (nome, valor), onde o valor pode assumir diferentes tipos.

Estou tentando usar um modelo de classe para cada ponto.Em seguida, para cada dados-ponto de eu ver, eu quero criar um novo objeto e empurre-o de volta em um vetor.Para cada novo tipo, eu preciso criar uma nova classe a partir do modelo de primeira.Mas eu não posso armazenar os objetos criados em qualquer vetor, uma vez que os vetores de esperar o mesmo tipo para todas as entradas.Os tipos que eu preciso loja não pode ser instalado em uma hierarquia de herança.Eles não estão relacionados.Também pode haver mais tipos criados no futuro, e eu não quero alterar o serviço de armazenamento para cada novo tipo.Existe uma maneira de criar um heterogêneos recipiente para armazenar essas entradas?Obrigado!

Foi útil?

Solução

A biblioteca Boost provavelmente tem o que você está procurando (Boost :: Qualquer).Você pode rolar seu próprio usando uma abordagem de ponteiro embrulhado se você não puder usar impulsionar ...

Outras dicas

boost::any já foi recomendado, no entanto, é para nada, então você não pode esperar muito dele.

Se você conhece os vários tipos antes do tempo, é melhor você usar boost::variant.

typedef boost::variant<Foo, Bar, Joe> variant_type;

struct Print: boost::static_visitor<>
{
  void operator()(Foo const& f) const { f.print(std::cout); }

  template <class T>
  void operator()(T const& t) const { std::cout << t << '\n'; }
};

void func(variant_type const& v) // not template
{
  boost::apply_visitor(Print(), v); // compile-time checking
                                    // that all types are handled
}

O problema com contêineres como este é que quando você deseja acessar algo no contêiner, você deve determinar seu tipo e, em seguida, lançá-lo ao tipo real de alguma forma.Isso é feio, ineficiente e propenso a erros, e é por isso que a escolha # 1 em C ++ é usar herança, a menos que você tenha uma boa razão para não - algo que eu nunca encontrei na minha carreira C ++.

Eu estava pensando que você poderia ter apenas um par (tipo, vazio *) e escrever sua própria função pop que lança o vazio *, dependendo do tipo descrito no par e, em seguida, empurra-os em qualquer conta. .

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