2017-07-10 5 views
11

ich das folgende Beispiel zu verstehen versuchte, die ich von http://en.cppreference.com/w/cpp/utility/variant/visit bekamMit std :: besuchen mit variadische template struct

#include <iomanip> 
#include <iostream> 
#include <string> 
#include <type_traits> 
#include <variant> 
#include <vector> 


using var_t = std::variant<int, long, double, std::string>; 

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; }; 
// what is this declaration imply??? 
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>; 

int main() { 
    std::vector<var_t> vec = {10, 15l, 1.5, "hello"}; 


    for (auto& v: vec) { 
     std::visit(overloaded { 
      [](auto arg) { std::cout << arg << '\n'; }, 
      [](double arg) { std::cout << std::fixed << arg << '\n'; }, 
      [](const std::string& arg) { std::cout << std::quoted(arg) << '\n'; }, 
     }, v); 
    } 
} 

Kann jemand bitte erklären, wie diese Struktur Arbeiten überlastet? Vor allem, was ich nicht verstanden habe, ist die folgende Erklärung.

template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>; 

Ohne diese Deklaration gibt der Compiler die folgenden Fehlermeldungen aus.

main.cpp: In function 'int main()': 
main.cpp:26:9: error: class template argument deduction failed: 
     }, v); 
     ^
main.cpp:26: confused by earlier errors, bailing out 

Zweck: Lernen

+0

Es ist [ein Vorschlag] (http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0051r2.pdf), so etwas zu der Standardbibliothek als 'std hinzufügen :: overload' und [ein 5-minütige Video] (https://www.youtube.com/watch?v=1gNzhE-Tn40&list=PLs3KjaCtOwSZ2tbuV1hx8Xz-rFZTan2J1&index=50) über diese umzusetzen. –

Antwort

10

Kann jemand bitte erklären, wie diese überladene Struktur funktioniert? Vor allem, was ich nicht verstanden habe, ist die folgende Erklärung.

template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>; 

Das ist ein user-defined deduction guide (Link zum Arbeitsentwurf). zusammen mit Klassenvorlage Argumente Abzug
Es ist ein Merkmal der Sprache durch die neueste Version des Standards eingeführt. Siehe auch here für weitere Details und eine benutzerfreundlichere Erklärung.
Dies ist keine richtige Erklärung, aber der Einfachheit halber können Sie es als Hinweis betrachten Sie können die Ableitung der Vorlage Argumente aus einer Reihe von Parametern an den Konstruktor führen führen.


Als Randbemerkung, fand here ich ein Beispiel, das ist ziemlich klar, und es ist das Kopieren lohnt sich über:

template<typename T> 
struct Thingy { T t; }; 

Thingy(const char *) -> Thingy<std::string>; 

// ... 

Thingy thing{"A String"}; // thing.t is a `std::string`. 

Credits @NicolBolas sind, eine aktive Benutzer hier auf SO. Leider kann ich nicht die Antwort finden, von der dieses Beispiel stammt.

+0

Vielen Dank ... –

+1

@PaulVarghese Sie sind willkommen. So funktioniert SO: Man öffnet eine Frage, jemand anderes versucht sein Bestes, um zu antworten. Ich hoffe, diese Antwort kann Ihnen und zukünftigen Lesern helfen. – skypjack

+3

Es sollte beachtet werden, dass 'overload' funktioniert, weil Aggregat Initialisierung in C++ 17 erweitert wurde in der Lage sein Basisklasse Subobjekte sowie Mitglieder zu initialisieren. Außerdem ist es "Nicol Bolas", [die Tyrant der Welten] (http://magic.wizards.com/en/story/planeswalkers/nicol-bolas), nicht Nicolas. –

Verwandte Themen