overloaded pattern für std:visit mit C++20
-
Hiho,
um ein Variant abzuarbeiten, nutze ich das overload(ed)-Pattern, welches u. a. unter https://en.cppreference.com/w/cpp/utility/variant/visit zu finden ist.
// helper type for the visitor #4 template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; }; // explicit deduction guide (not needed as of C++20) template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>; ... 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);
Jetzt habe ich gesehen, dass man unter C++20 die Zeile 4 weglassen kann, also die freie Funktion, welche in C++17 die Argumente erhalten hat, durch die Template-Ellipse die Typen extrahiert und dann an die template struct weitergegeben hat.
Durch welches neue Feature kann man denn auf die Zeile jetzt verzichten? Effektiv übergibt man ja jetzt an die struct eine Liste, obwohl es weder Konstruktor noch Membervariablen gibt, und es werden irgendwie automatisch die Typen davon genommen?!VG
Pellaeon
-
Eine Verbesserung von CTAD
https://en.cppreference.com/w/cpp/language/class_template_argument_deduction#NotesSiehe der block "bis C++20" unter Notes.