cpp::daily #Episódio002 - Ligações e Marcadores de Posição
std::bind e std::placeholders, 10 exemplos!
Muitas vezes precisamos implementar uma função sob demanda, ou seja, passar parâmetros de acordo com a necessidade do nosso aplicativo. E o std::placeholders servem para isso.
O namespacestd::placeholders trabalha juntamente com a função std::bind e precisamos incluir o cabeçalho <funcional> para poder utilizarmos. Eles contém os objetos de placeholder [_1,..._N] onde N é um número máximo definido pela implementação.
O template de função std::bind retorna um objeto de função com base em fn, mas com seus argumentos vinculados a args.
Quando usado como um argumento em uma expressão std::bind, os objetos de espaço reservado são armazenados no objeto de função gerado e quando esse objeto de função é chamado com argumentos não acoplados, cada espaço reservado _N é substituído pelo enésimo argumento não acoplado correspondente.
Características das Ligações e marcadores de posição
Cada espaço reservado é declarado como : extern /* não especificada */ _1; // até o c++17;
As implementações são estimuladas a declarar os marcadores de posição como: inline constexpr /* não especificada */ _1;
Embora os declare por: extern /* não especificada */ _1; , ainda é permitido pelo padrão;
Os tipos de objetos de espaço reservado são DefaultConstructible e CopyConstructible
Seus construtores de cópia/movimentação padrão não lançam exceções;
Para qualquer espaço reservado _N, o tipo std::is_placeholder<decltype(_N)>;
É definido e é derivado de std::integral_constant<int, N>.
Exemplos
01. Usando o básico com parâmetro _1
Dada a função soma_sub(int, int, int) que retorna a soma e subtração dos parâmetros, respectivamente, se quisermos que um parâmetro seja dinâmico:
Terceiro parâmetro dinâmico
02. Segundo parâmetro dinâmico
Substitui o y
03. Primeiro parâmetro dinâmico
Substitui o x
04. Substituindo 2 parâmetros
Substitui o y e o z, respectivamente _1 e _2 . Como estamos usando o parâmetro _2, precisamos passar 2 parâmetros, caso contrário gera erro ao compilar.
05. Substituindo 2 parâmetros com alteração na ordem
Substitui o z e o y, respectivamente _2 e _1
06. Substituindo 2 parâmetros, mas alterando só o segundo
_2 = y , x = 1, z = 3 . Tem que passar 2 parâmetros(senão não compila), mas o 1º será ignorado!
07. Substituindo só o 3º parâmetro
Pra entender de vez! x = _3, precisa informar 3 parâmetros(senão não compila), pois está usando o _3, mas os dois primeiros serão ignorados.
08. Usando alias
Nova função de nome show_name( std::string & )
09. Sem usar o auto
10. Sem indicar namespace
Exemplo final sem explicações, exercício!
Curiosidades: Se você o std::bind puro, ele pode lhe dar um resultado incorreto. Outra coisa também é se você usa o bind da lib boost: boost::bind não é compatível com a std::bind.
Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!