gpt4 book ai didi

c++ - std::访问带有重载自由函数而不是函数对象的 std::variant

转载 作者:行者123 更新时间:2023-12-01 21:57:47 28 4
gpt4 key购买 nike

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

最佳答案

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

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

Demo

关于c++ - std::访问带有重载自由函数而不是函数对象的 std::variant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60622666/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com