tak v tomto príklade od: http://en.cppreference.com/w/cpp/utility/variant/visit vyhlasuje špecializovaný typ:
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
Ktorý je tu vytvorený ako r-hodnota:
std::visit(overloaded {
[](auto arg) { std::cout << arg << " "; },
[](double arg) { std::cout << std::fixed << arg << " "; },
[](const std::string& arg) { std::cout << std::quoted(arg) << " "; },
}, v);
Snažím sa zistiť, ako to funguje. Čo je to za typ overloaded
tu zdedí? Vyzerá to ako rad lambdas, ale ja nevím, ako by to malo operator()
, Môže niekto vysvetliť, ako tu funguje dedičstvo?
odpovede:
6 pre odpoveď č. 1overloaded
z každého lambda zdedí jednotlivo a každýlambda má operátora volania. Preto vytvoríte štruktúru, ktorá má všetkých operátorov volanie v jednej množine preťaženia. Pokiaľ nie sú jednoznačné, automaticky sa vyberie.
Môžete si predstaviť variadic šablónu rozšíriť
struct overloaded :
// inherits from
decltype([](auto arg) { std::cout << arg << " "; }),
decltype([](double arg) { std::cout << std::fixed << arg << " "; }),
decltype([](const std::string& arg) { std::cout << std::quoted(arg) << " "; })
// has three operator()s
{
using decltype([](auto arg) { std::cout << arg << " "; })::operator();
using decltype([](double arg) { std::cout << std::fixed << arg << " "; })::operator();
using decltype([](const std::string& arg) { std::cout << std::quoted(arg) << " "; })::operator();
};
Okrem skutočného kódu by to nefungovalo, pretože lambdy s tým istým telom by stále mali rôzne typy.
Vytvára 1 overloaded
typu s viacnásobným dedičstvom na inštanciu.