Sem categoria

Legibilidade com C++14 – get_numeric

Eu escrevi um código em C++ há um tempo atrás e quando olhei hoje vi como a legibilidade mudou desde o C++11.

Neste código eu vi algumas coisas interessantes. Ele serve bem de exemplo para alguns tipos de codificação

  1. Codificação concreta
  2. Codificação genérica
  3. Codificação concreta com C++ moderno
  4. Codificação genérica com C++ moderno

Vamos ver agora cada um deles.

O algoritmo

O algoritmo que eu implementei é bem simples. Ele itera em uma std::string de entrada e copia somente os caracteres não numéricos para a string de saída.
Ex: “12asew3d45ddf678ee9 0” => “1234567890”

Codificação concreta

Essa é a versão mais simples de todas, de implementar e de entender.

Nós estamos usando o for_each com um Functor numerical_appender para que ele adicione na string de saída somente os caracteres numéricos.

É uma implementação trivial. Para cada caractere da entrada, o operator() será chamado.

Codificação genérica

Aqui nós temos uma diferença básica. Ao invés de receber uma string, o algoritmo trabalha com iteradores somente e dessa forma suporta qualquer tipo de vetor, podendo ser uma string, vector, list, etc…

Codificação concreta com C++ moderno

C++ 11 e o lambda vieram facilitar a nossa vida e melhorar a legibilidade realmente.
Vamos fazer a implementação concreta da nossa função:

Bem mais simples!

Temos agora uma função encadeada dentro de get_numeric e fazendo o filtro.

Codificação genérica com C++ moderno

Agora temos uma surpresa interessante. Vejamos a diferença dela para a versão concreta.

Note que ela é quase igual à versão concreta. Temos o template de diferença e o auto no lambda. Fácil, não acha?

C++ 14 – STL

No C++ 14 (desde o C++ 11, na verdade) temos um método novo na STL chamado copy_if. Esse método faz basicamente o que o std::copy faz, porém tendo um predicado para definir se o caractere será copiado.

Simples, não?

Uma outra forma de implementar esse mesmo método seria usar o iterador com predicado. Fica para quem tiver curiosidade:
http://simplycpp.com/2015/10/13/iterator-com-predicado-o-que-e-isso/

Referências

Fonte:

  • https://github.com/SimplyCpp/examples/blob/master/numeric.cpp

Referências:

  • http://www.cplusplus.com/reference/algorithm/copy_if/
  • http://www.cplusplus.com/reference/algorithm/for_each/

Leave a Reply

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