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.
https://gist.github.com/thiagomg/3599dd59ff6bd7632fd4
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:
https://gist.github.com/thiagomg/608c1e50eee63836de1d
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
https://gist.github.com/thiagomg/42f0b8632dbbb8484953
E só para não dizer que não temos um bom caso para o macro:
https://gist.github.com/thiagomg/13f49494c09f0989de71
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
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.
https://gist.github.com/thiagomg/3599dd59ff6bd7632fd4
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:
https://gist.github.com/thiagomg/608c1e50eee63836de1d
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
https://gist.github.com/thiagomg/42f0b8632dbbb8484953
E só para não dizer que não temos um bom caso para o macro:
https://gist.github.com/thiagomg/13f49494c09f0989de71
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
Comentários
Postar um comentário