如何解决有没有一种干净的方法可以将重载集转换为适合与 std::visit 一起使用的访问者?
class C
{
public:
static void f(const A &);
static void f(const B &);
};
我想做类似的事情
std::variant<A,B> v;
// ...
std::visit(C::f,v);
但这不能编译。是否有某种方法可以将重载集视为访问者或将其转换为访问者?
解决方法
实际上,在进一步研究之后,我意识到我可以做到
std::visit([](const auto & t) { C::f(t); },v);
所以我会把它留在这里作为其他有同样问题的人的潜在解决方案。
,如果您已经使用 Boost,Boost.HOF 有一个实用程序可以为您包装重载集:BOOST_HOF_LIFT
:
std::visit(BOOST_HOF_LIFT(C::f),v);
,
如果您可以创建类 C
的实例,则可以重载类 operator()
上的成员 C
以根据变体类型调用适当的函数:
#include <iostream>
#include <variant>
struct A {};
struct B {};
class C
{
public:
template <typename T>
void operator()(const T& t) { C::f(t); }
static void f(const A &) { std::cout << "A\n"; }
static void f(const B &) { std::cout << "B\n"; }
};
int main()
{
std::variant<A,B> v_a = A{};
std::variant<A,B> v_b = B{};
C c;
std::visit(c,v_a); // "A"
std::visit(c,v_b); // "B"
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。