Inferência de tipo no C++ moderno

Inferência de tipo é a dedução automática do tipo de dado a partir de uma expressão. No caso do C++ moderno a dedução é feita pelo compilador.

Os templates do C++ já possuiam um forma limitada de dedução de tipos, ou seja, você não precisa indicar o tipo de dado explicitamente como demonstrado no exemplo abaixo:

Continuar lendo

Anúncios

Composição, parte 1 – com exemplo clássico do Unix

A idéia deste post é reproduzir a demonstração clássica feita por Brian Kernighan utilizando composição de pequenos programas através dos Unix pipelines. Ela é bem simples, porém muito significativa, se trata desta sequência:

makewords text_file | lowercase | sort | unique | mismatch dictionary_file

Onde o objetivo é identificar quais palavras do texto (text_file) são desconhecidas pelo dicionário (dictionary_file) informado:

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

Dependência cíclica de headers

Uma coisa que acaba atrapalhando quem está começando no C++ é a dependência cíclica dos headers. Quando estamos escrevendo programas minúsculos isso não acontece, mas é um cenário muito comum.

Antes de falar mais sobre as dependências, vamos entender um pouco da inclusão destes headers. Como funciona o famoso #include ?

Supondo que temos 3 arquivos: main.cpp, main.h e int_vector.h, com o seguinte conteúdo:

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

Range loops – Escrevendo código seguro

Eu estava olhando um código de um sistema e me deparei com um trecho que me fez torcer o nariz. O código funcionava, mas imediatamente vi dois problemas potenciais:

  1. Bug de int/unsigned int
    1. Um vector::size() – 1
    2. Se size for 0, o resultado será 4294967295 ou 0xFFFFFFFF!
  2. Código confuso e facilmente quebrável
    1. msgs[count] – Não tem offset dinâmico
    2. Um count inválido pode quebrar o programa

Eu suponho que a pessoa que desenvolveu o código fez dessa forma para pegar os itens que estavam no vector, excluindo os itens da borda (0:n), mas como seria essa implementação da forma STL de se programar ?

Continuar lendo

Iterator com predicado, o que é isso?

O iterator é um objeto que aponta ou indica um elemento em uma extensão de elementos, tais como containers da STL (por exemplo: std::vector) ou um array.

A Standard Template Library (STL) possui uma boa variedade de containers ou coleções que podem armazenar elementos, onde uma das operações naturais sobre estes containers são as iterações – assim é possível percorrer ou visitar cada elemento presente. Certa vez, li uma definição do relacionamento entre os principais recursos da STL (iterators, algorithms e containers) que era algo do tipo: algorithms atuam em containers através de iterators. Esta é uma definição simplificada e válida do que chamamos de “STL-way”. Se tentar copiar elementos de um std::vector para outro std::vector, provavelmente utilizará um std::copy e passará um par de iterators (begin e end) para indicar a extensão a ser copiada, além de utilizar um outro iterator para indicar o destino:

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

Lambda e a Inferência

Duas das coisas que mais me agradaram no C++ atual são: a inferência de tipo e as expressões lambda (ou simplesmente lambda).

Neste post, quero focar em 5 pontos interessantes sobre estes assuntos. São eles:

1. O que é um lambda?
2. Lambda e Functor, qual a relação entre eles?
3. Como funciona a inferência feita em um lambda?
4. Lista de captura de um lambda
5. Legibilidade interessante Continuar lendo