Implementações variadas à regra de Horner (Horner’s Rules)

Variadic functions são funções que aceitam um número arbitrário de argumentos. No C++, existe uma forma dinâmica de resolução deste tipo de função herdada do C através de variadic arguments. Além de outra, introduzida no C++ moderno, que é de resolução estática e baseada em templates, denominada de variadic templates.

Neste post, o objetivo é mostrar a implementação do método de Horner utilizando estas duas abordagens com variadic, uma que é resolvida em tempo de execução (variadic arguments) e outra em tempo de compilação (variadic templates).

Continuar lendo

Anúncios

Valores Aleatórios Simplificados

A partir do C++ 11, foi introduzido o header <random> com diversos facilitadores para suporte de geração de números aleatórios. A produção destes números é feita através da combinação de duas categorias de objetos: os geradores e os distribuidores. Os geradores, são responsáveis pela geração dos números, e os distribuidores são responsáveis pela transformação dos números gerados em algum tipo de distribuição de probabilidade. Como por exemplo, uma distribuição normal (aquela da Gaussiana) ou uma distribuição de Pareto (aquela do 80-20). As opções não faltam, como você pode ver nas referências, por exemplo:  http://www.cplusplus.com/reference/random/ ou http://en.cppreference.com/w/cpp/header/random.

Continuar lendo

STL não tem split – e por que isso não é importante!

Orientação a objetos é um paradigma de programação muito usado nas linguagens consideradas modernas, tais como: C++, Java, C#, entre outras… Em teoria, um código orientado a objetos pode ser facilmente reusado e entendido. Porém, eu gostaria de analisar um caso neste post. Então, vamos fazer um pequeno exercício por aqui.

Aviso: Orientação a objetos (OO) é um paradigma de programação que envolve classes e objetos, polimorfismo, herança, e uma série de outros recursos. Ter ou usar objetos não significa que seja orientado a objetos em sua plenitude. Uma das premissas da OO é que o estado interno dos objetos deve ser inacessível externamente – isso se chama encapsulamento. No entanto, encapsulamento do estado sempre é bom? Fica aí algo para pensarmos, não é mesmo?

São constantes as reclamações que C++ não tem funções básicas na STL como, por exemplo, string split. Então, vamos implementar uma por aqui.

Continuar lendo

C, C++ e string: Uma combinação (quase) perfeita

As linguagens de programação C e C++ possuem uma relação. Praticamente vivem em harmonia e sintonia – mesmo existindo compiladores e padrões distintos. Essa combinação é que possibilita escrevermos abstrações “próximo ao metal”, estabelecendo um equilíbrio entre a compreensão (do código, que depende de ponto de vista e conhecimento) e o desempenho.

O problema é quando truques e hacks entram em ação. Um dos meus favoritos com C++ é sobrescrever no buffer de uma string. Isso é feito através do retorno do método c_str(), que disponibiliza um ponteiro para este buffer interno. No entanto, é necessário fazer um const_cast para remover o constness do ponteiro e assim sobrescreve-lo.

Os exemplos que elaborei para este post são uma tentativa de simular um problema real que me custou quase um dia inteiro de depuração, por causa de um hacking “metido a besta”. 🙂

Continuar lendo

Policy-based design: log writer

Policy-based design

Vamos neste artigo dar mais uma pincelada no Policy-based design. Vamos fazer como exemplo uma classe de log.
Como este é só um exemplo, não vamos considerar múltiplos parâmetros no log, mas somente uma string, assim não fugiremos do assunto.

Uma das coisas mais importantes neste tipo de design é o desacoplamento. Ele é uma excelente alternativa ao uso de interfaces por duas razões:

  1. Não gera chamadas virtuais (ou um nível de indireção em tempo de execução)
    Duck typing (https://pt.wikipedia.org/wiki/Duck_typing)
  2. Eu gosto bastante desse tipo de design, já usado aqui: http://simplycpp.com/2016/02/05/leitura-de-configuracao-em-c/

Continuar lendo

Leitura de configuração em C++

Uma coisa que é comum no ambiente Java e que eu gosto muito são os arquivos de properties. Não é de hoje que eu os uso para configurar aplicações que eu faço.
Eu tinha uma classe de configuração feita na época do C++98 e que hoje, usando, fiquei com vontade de reescrevê-la para ficar com um aspecto mais atual.

Eu pensei nas seguintes regras:

  1. Eu não preciso manter a mesma assinatura;
  2. Vou tentar fazer da forma mais didática possível;
  3. Vou tentar não repetir código;
  4. Eu quero me divertir fazendo isso;
  5. Vamos falar de Policy-based design.

Continuar lendo