2

在 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;
}
4

2 回答 2

6

您可以使用 lambda 来处理重载:

for (auto& each : list) std::visit([](auto e){ return foo(e);}, each);

演示

于 2020-03-10T17:20:46.247 回答
1

想想你在这里做什么:你调用visit并传递它“可以调用的东西”。

这只是一件事,而不是“编译器可以找到的任何名称foo

为了实现你所要求的,编译器必须自动构建某种包含 foo 的所有重载的东西,然后将它传递给visit- 这就是你正在做的foo_obj

于 2020-03-10T17:19:52.613 回答