gpt4 book ai didi

c++ - 如何使 boost::apply_visitor 成为类访问者的友元函数?

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:51 30 4
gpt4 key购买 nike

如何制作 boost::apply_visitor (两种变体之一)类访问者的友元函数?

我尝试了以下方法:friend result_type boost::apply_visitor<>(decltype(*this) &, instruction_type const &); ,但这不起作用。 *this源自 boost::static_visitor (或有 using result_type = ...; typedef)和指令类型是 boost::variant一些特定的类型。 *this有所有需要的operator () -s 在 private部分。

这种声明的正确形式是什么?

最佳答案

如果您坚持,您可以将您的实际访问者包装在一个公开所需接口(interface)的访问者中,并将那个声明为您的访问者实现的 friend (现在结合了实现和访问者的概念) .

(这里的“好”(咳嗽)是impl 不需要多态或动态分配。)

这是一个直接的概念证明:

#include <boost/variant.hpp>

namespace detail
{
template <typename R, typename Wrapped>
struct WrapVisitor : boost::static_visitor<R>
{
template <typename... T> R operator()(T&&... args) const { return _wrapped(std::forward<T>(args)...); }

WrapVisitor(Wrapped&& wrapped) : _wrapped(std::move(wrapped)) {}
private:
Wrapped _wrapped;
};
}

template <typename R, typename Wrapped>
detail::WrapVisitor<R, Wrapped> wrap(Wrapped&& wrapped) {
return { std::forward<Wrapped>(wrapped) };
}

下面是如何将它与隐藏所有实现细节的演示访问者一起使用:

class PrivateVisistorImp : protected boost::static_visitor<double>
{
double operator()(int i) const { return -i; }
double operator()(double d) const { return d*10; }

friend detail::WrapVisitor<double, PrivateVisistorImp>;
};

当然,它需要在调用站点实例化包装访问者的成本:

int main()
{
using Var = boost::variant<int, double>;

Var a = 3.14, b = 42;
auto w = wrap<double>(PrivateVisistorImp());
std::cout << boost::apply_visitor(w, a) << "\n";
std::cout << boost::apply_visitor(w, b) << "\n";
}

查看全部 Live on Coliru

关于c++ - 如何使 boost::apply_visitor 成为类访问者的友元函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18674433/

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