Pergunta

C++ 0x possui aliases de modelo (às vezes chamados de modelo typedefs).Ver aqui.As especificações atuais do C++ não.

O que você gosta de usar como solução alternativa?Objetos contêineres ou macros?Você sente que vale a pena?

Foi útil?

Solução

O que você gosta de usar como solução alternativa?Objetos contêineres ou macros?Você sente que vale a pena?

A maneira canônica é usar uma metafunção como esta:

template <typename T>
struct my_string_map {
    typedef std::map<std::string, T> type;
};

// Invoke:

my_string_map<int>::type my_str_int_map;

Isso também é usado no STL (allocator::rebind<U>) e em muitas bibliotecas, incluindo Boost.Nós o usamos extensivamente em um biblioteca bioinformática.

Está inchado, mas é a melhor alternativa 99% das vezes.Usar macros aqui não compensa as muitas desvantagens.

(EDITAR:Alterei o código para refletir as convenções Boost/STL conforme apontado por Daniel em seu comentário.)

Outras dicas

template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};

Você não deve herdar de classes que não possuem um destruidor virtual.Está relacionado ao fato de destruidores em classes derivadas não serem chamados quando deveriam e você pode acabar com memória não alocada.

Dito isto, você *****provavelmente***** poderia se safar no exemplo acima porque não está adicionando mais dados ao seu tipo derivado.Observe que isso não é um endosso.Eu ainda te aconselho não faça isso.O fato de você pode isso não significa que você deve.

EDITAR:Sim, esta é uma resposta à postagem de ShaChris23.Provavelmente perdi alguma coisa porque apareceu acima da mensagem dele, e não abaixo.

Às vezes você pode simplesmente escrever explicitamente os typedefs não modelados para todos os tipos necessários.Se a classe base for modelada em vários argumentos de modelo com apenas um tipo desejado para ser digitado, você poderá herdar uma classe especializada com typedef efetivamente incluído no nome da classe herdada.Esta abordagem é menos obscura do que a abordagem da metafunção.

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