beginner_intermediate

Do macro ao template

Uma coisa que gera discussões acirradas dentre as pessoas nestes tempos mais modernos do C++ é o uso de macros.

Dentre os argumentos contra as macros estão os de que o uso de macros leva a criação de uma nova linguagem (o que é bem verdade quando usado sem moderação).

Quando se está desenvolvendo em C muitas coisas acabam sendo feitas usando macro por não termos estruturas genéricas para resolver problemas.

Para que a estrutura possa receber int ou double ou seja lá qual tipo numérico, eu preciso usar macro.

A alternativa para C++ é bem conhecida => templates!

Os templates fornecem uma forma type-safe, em compile-time, de se implementar as mesmas rotinas, de forma tão eficiente quanto a macro e com validação sintática feita pelo compilador.

No primeiro exemplo, T é o container (vector, list, forward_list, etc) e U é o tipo de dados value_type do container.

Já no accumulate, temos uma pegadinha:

Reparem o auto no retorno e a declaração da variável ret. A declaração typename T::value_type é um define interno do container que exporta o tipo de dados que ele aloca internamente. Por não saber se o dado interno é um int ou algo como MeuUltraMegaHugeDouble, não podemos colocar ret = 0, mas usamos o inicializador padrão {}.

Bom, claro que temos containers da stdlib para facilitar a nossa vida

E só para não dizer que não temos um bom caso para o macro:

Desta forma, uma chamada de LOG_INFO(“msg received: %s”, msg->toString()) não resolverá o toString caso o nível de log info não esteja ativo.

Minha regra de ouro pessoal: Se possível evitar a macro, evite.

Código: https://github.com/SimplyCpp/examples/blob/master/macro_templ.cpp

Leave a Reply

Your email address will not be published. Required fields are marked *