A maioria dos desenvolvedores C++ sonham com a possibilidade das declarações abaixo:
std::vector< std::string > peoples = { “joao”, “pedro", “maria" };
ou
std::list< std::pair< std::string, int> > peoples = {
{"joao",12}, {"maria", 15}, {"pedro", 20}
};
Agora o sonho se tornará realidade, pois é isto que a lista de inicialização irá possibilitar no C++ 0x. Desenvolvedores C++ não ficarão mais restritos a utilização de lista de inicialização apenas em arrays.
Para a construção da lista de inicialização o C++ 0x irá associa-la a um novo tipo chamado std::initializer_list. Isto permitirá que construtores e as tradicionais funções recebam uma lista de inicialização como parâmetro. A lista de inicialização pode ter tamanho arbitrário, mas os elementos devem ser homogêneos (todos do mesmo tipo T ou conversíveis para T).
Por exemplo:
class List
{
public:
List(std::initializer_list< int > list);
};
Esta declaração permite que a classe List seja construída a partir de uma sequência de inteiros como mostrado no exemplo abaixo:
List my_list = {1, 4, 5, 6};
O construtor da classe List é chamado construtor de lista de inicialização.
A classe std::initializer_list, apesar de ser um tipo de primeira classe no C++ 0x, somente pode ser inicializada estaticamente pelo compilador. A lista de inicialização sempre é constante e não pode ser modificada depois de criada.
Vejamos abaixo a implementação do construtor de lista de inicialização da classe std::vector da biblioteca padrão de gabarito – (Standard Template Library). Este exemplo foi retirado
daqui.
template< class E> class vector {
public:
vector (std::initializer_list s) // novo construtor da lista de inicialização
{
// reserva o espaço de memoria apropriado
reserve(s.size());
// inicializa elementos com o da lista de inicializacao
uninitialized_copy(s.begin(), s.end(), elem);
// seta o tamanho do vector
sz = s.size();
}
// ...... ...
};
Observe que não existe almoço grátis. O programador deve implementar o suporte para a lista de inicialização para todas as suas classes.
Por hoje é isso. Em breve posto outra feature do C++ 0x.
[]'s
Leonardo X. T. Cardoso