首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用重载的free-function而不是function-object访问std::variant

使用重载的free-function而不是function-object访问std::variant
EN

Stack Overflow用户
提问于 2020-03-11 01:13:04
回答 2查看 1K关注 0票数 2

在C++17中,有没有一种简单的方法来访问一个带有重载的自由函数的变量,或者我必须使用一个带有重载的调用操作符的对象?

换句话说,有没有可能添加一些简单的东西,使下面的//ERROR!行在功能上与//OK!行相同?

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-11 01:20:46

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

代码语言:javascript
复制
for (auto& each : list) std::visit([](auto e){ return foo(e);}, each);

Demo

票数 6
EN

Stack Overflow用户

发布于 2020-03-11 01:19:53

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

这只是其中之一,而不是“编译器能找到的任何名为foo的东西”。

要实现您所要求的内容,编译器必须自动构建某种包含所有foo重载的东西,然后将其传递给visit -这就是您使用foo_obj所做的事情

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60622666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档