在C++17中,有没有一种简单的方法来访问一个带有重载的自由函数的变量,或者我必须使用一个带有重载的调用操作符的对象?
换句话说,有没有可能添加一些简单的东西,使下面的//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;
}发布于 2020-03-11 01:20:46
您可以使用lambda来处理重载:
for (auto& each : list) std::visit([](auto e){ return foo(e);}, each);Demo
发布于 2020-03-11 01:19:53
想一想你在做什么:你调用visit并传递给它“可以调用的东西”。
这只是其中之一,而不是“编译器能找到的任何名为foo的东西”。
要实现您所要求的内容,编译器必须自动构建某种包含所有foo重载的东西,然后将其传递给visit -这就是您使用foo_obj所做的事情
https://stackoverflow.com/questions/60622666
复制相似问题