Estou lendo o livro "C++17 - The Complete Guide", de Nicolai M. Josuttis.
O Capítulo 14 é intitulado "Usando declarações de using variadic". Não entendi o código de exemplo nele:
// Part 1: "inherit" all function call operators of passed based types:
template<typename... Ts>
struct overload : Ts...
{
using Ts::operator()...;
}
// Part 2: base types are deduced from passed arguments
// >>>> What is it ?? -> see answer from Ted Lyngmo
// EDIT: That's also based on the fact that overload can use
// aggregate initialization, and so that overload can be
// instancied with a constructor with any number and types
// (but we have to help it to deduce the types).
template<typename... Ts>
overload(Ts...) -> overload<Ts...>;
// Part 3
auto twice = overload {
[](std::string& s) { s += s; }
[](auto& v) { v *= 2; }
};
O código tem 3 partes:
parte 1: Entendo que declaramos uma classe que terá finalmente 3 operadores de chamada de função.
parte 2: Não entendi essa... - o que estamos declarando aqui? Você poderia explicar a sintaxe, especialmente
overload(Ts...)
?parte 3: Usamos inicialização agregada para inicializar operadores de chamada de função de classes base.
Se eu tiver que ler um capítulo anterior novamente, me diga qual!
Este é um guia de dedução definido pelo usuário . Ele será usado quando o modelo de classe
overload
for instanciado sem especificar explicitamente quaisquer parâmetros de modelo. Ele então ajuda a deduzir a classe comooverload<Ts...>
.Nesse contexto:
...faz
twice
do tipoEm C++20, os guias de dedução gerados implicitamente seriam suficientes, mas em C++17 esse guia de dedução é necessário para esse tipo de instanciação.