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

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

Por quem os ponteiros dobram, estrelando std::accumulate

O std::accumulate é um algoritmo de operação numérica, da mesma forma que std::iota explorado anteriormente (http://simplycpp.com/2015/11/06/mestre-iota/), reside no header <numeric> da STL: http://www.cplusplus.com/reference/numeric/accumulate/.

Seu objetivo, até mesmo porque o nome desta função dá uma dica, é acumular elementos que pertencem a um range fornecido por um par de iterators (usualmente begin e end para uma sequência completa). O std::accumulate também possui um valor inicial para o acumulador que é fornecido como terceiro parâmetro desta função.

Supondo um array de tamanho 10 e já inicializado como container de referência para os exemplos a seguir:

Continuar lendo

Mestre Iota

Iota é a nona letra do alfabeto grego, ela é equivalente à letra i do nosso alfabeto. Por convenção ou hábito, utilizamos a letra i na programação para indicar algum tipo de incrementador, como por exemplo, em um for-loop.

Curiosamente, iota, como identificador, também é utilizado na programação para indicar uma sequência finita e consecutiva de números inteiros, como por exemplo, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. Inclusive, originalmente na STL existia a função iota, inspirada pela linguagem de programação APL, você pode conferir neste link: http://www.sgi.com/tech/stl/iota.html

Continuar lendo

Por quê usar templates ?

Se você não está usando templates com C++, você está perdendo toda a diversão.

A linguagem C++, apesar de suportar orientação a objetos, diferentemente de Java, não te “obriga” a usá-la. Você poderá ter o melhor dos mundos, em termos dos paradigmas e idiomas. Um pouco de orientação a objetos aqui e programação genérica ali, tudo isto no mesmo código!

Vamos fazer uma implementação do seguinte código:

Continuar lendo

Templates e geração de código

O que é um template ?

A programação genérica no C++ se dá em grande parte através de templates. Eles parecem mágicos, pois diferente de um objeto, ele não verifica assinaturas.

Como saber se “C” tem o método sum, sem ter uma interface ?
Isso é validado em tempo de compilação, pois diferente de linguagens como Java, a função declarada com template existe somente quando é instanciada.

Vamos ver isso com exemplos e código rodando !

Continuar lendo

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.

Continuar lendo