std::visit std::variant с перегруженной свободной функцией вместо объекта-функции
В C++17 есть простой способ std::visit варианта с перегруженной бесплатной функцией или я должен использовать объект с перегруженным оператором вызова?
Другими словами, можно ли добавить что-нибудь простое, чтобы сделать следующее //ERROR!
line, чтобы функционально быть таким же, как //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;
}
2 ответа
Решение
Вы можете использовать лямбда для обработки перегрузок:
for (auto& each : list) std::visit([](auto e){ return foo(e);}, each);
Подумайте, что вы здесь делаете: вы звоните visit
и передать "то, что можно назвать".
Это всего лишь что-то, а не "все, что компилятор найдет с именем foo
"
Чтобы реализовать то, что вы просите, компилятор должен будет автоматически создать что-то, содержащее все перегрузки foo, а затем передать его в visit
- и это то, что вы делаете с foo_obj