/ / Čo je to typ Táto štruktúra je dedičná z? - c ++, operátory, variadic-templates, špecializácia, dedičstvo šablón

Čo je typ Tento štruktúra je dedičstvom? - c ++, operátori, variadic-šablóny, špecializácia, šablóna-dedičstvo

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ď č. 1

overloaded 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.