В C ++ 17 есть простой способ std :: visit варианта с перегруженной бесплатной функцией или я должен использовать объект с перегруженным оператором вызова?
Другими словами, можно ли добавить что-нибудь простое, чтобы следующая строка //ERROR!
была скомпилирована так, чтобы она была функционально такой же, как строка //OK!
?
#include<variant>
#include<iostream>
#include<list>
#include <boost/hana/functional/overload.hpp>
using boost::hana::overload;
struct A {};
struct B {};
void foo(A) { std::cout << "Got an A!\n"; }
void foo(B) { std::cout << "Got a B!\n"; }
using AorB = std::variant<A,B>;
constexpr auto foo_obj = overload(
[](A){std::cout << "Got an A!\n";},
[](B){std::cout << "Got a B!\n";});
int main() {
std::list<AorB> list{A(), B(), A(), A(), B()};
for (auto& each : list) std::visit(foo, each); // ERROR!
for (auto& each : list) std::visit(foo_obj, each); // OK!
return 0;
}
std::visit
не отличается от любого другого параметра: он должен быть дискретного типа. - person Sam Varshavchik   schedule 10.03.2020