gpt4 book ai didi

c++ - 带有 lambda 表达式的内联变体访问者访问者

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:08 25 4
gpt4 key购买 nike

有一个经典的访客:

struct Visitor
{
virtual ~Visitor() = default;
virtual void visit(X& x) {}
virtual void visit(Y& y) {}
virtual void visit(Z& z) {}
};

struct Object
{
virtual void accept(Visitor& visitor) { visitor.visit(*this); }
};

X,Y,Z 派生自 Object。

我想让访问者在现场使用 lambda,就像这样:

auto visitor = make_visitor<Visitor>
(
[](X& x) {do operations on x},
//for Y do not want to do anything. default implementation is suitable.
[](Z& z) {do operations on z}
);

object.accept(visitor);

有什么想法可以实现 make_visitor 吗?

(我阅读了 https://accu.org/index.php/journals/2160,它很棒 - 我只是想要一个更短、更方便的 make_visitor 形式)

最佳答案

几年前我想做同样的事情,我想到了这个:

template<typename ResultType, typename ... Callables>
class visitor;

template<typename ResultType, typename Callable, typename ... Callables>
class visitor<ResultType, Callable, Callables...>
: public Callable, public visitor<ResultType, Callables...>::type
{
public:
using type = visitor;

public:
visitor(Callable callable, Callables... callables)
:
Callable(callable), visitor<ResultType, Callables...>::type(callables...)
{
}

public:
using Callable::operator();
using visitor<ResultType, Callables...>::type::operator();

}; // class visitor

template <typename ResultType, typename Callable>
class visitor<ResultType, Callable>
: public Callable, public boost::static_visitor<ResultType>
{
public:
using type = visitor;

public:
visitor(Callable callable)
:
Callable(callable)
{
}

public:
using Callable::operator();

}; // class visitor

template<typename ResultType = void, typename ... Callables>
typename visitor<ResultType, Callables...>::type
make_visitor(Callables... callables)
{
return (typename visitor<ResultType, Callables...>::type(callables...));
}

它不是调用名为 visit 的方法,而是使用调用运算符 operator() 但可以通过添加一个 visit 方法来修改调用可调用对象。

希望它在实现方面足够清楚,可以理解,简而言之,它是一个继承自所有不同 lambda 的类,因此它将所有主要功能组合在一个类中。

当时它的主要灵感来自这个答案:https://stackoverflow.com/a/18731900/1147772 .

关于c++ - 带有 lambda 表达式的内联变体访问者访问者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48117798/

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