添加调试工具以提高变体访客

时间:2018-07-20 06:20:35

标签: c++ crtp boost-variant visitor-pattern

我在整个项目中都使用boost-variant,并且我认为它是boost上最有用和最通用的工具之一。

但是如果涉及到访客模式与递归嵌套变体的复杂使用,调试有时会很麻烦。

因此,我决定实现可重复使用的DebugVisitor,可以将其添加到现有访问者中。万一发生缺陷,应该将其轻松添加/删除到我现有的访问者中。

容易移动的意思是,它应该可以添加到任何现有的Visitor类中,而不是修改使用Visitor实例的位置。

我试图找到一种适合我要求的解决方案。以下代码可以编译,但不幸的是,它不会显示消息。

有人知道为什么吗?

#include <iostream>
#include <boost/variant.hpp>
#include <functional>

template<typename V> // V must have the boost::static_visitor Interface
struct DebugVisitor : public V {
    template<typename U>
    typename V::result_type operator()(const U& u) const {
        std::cout << "Visiting Type:" << typeid(U).name() << " with Visitor: " << typeid(V).name() << std::endl;
        return V::operator()(u);
    }
};


struct AddVisitor : public DebugVisitor<boost::static_visitor<boost::variant<int, double>>> {
    template<typename U>
    result_type operator()(const U& u) const {
        return u + 1.;
    }
};

int main(int, char**) {
    boost::variant<double, int> number{ 3.2 };

    AddVisitor d;
    auto incr=number.apply_visitor(d);
    if (auto dValue = boost::get<double>(incr)) {
        std::cout << "Increment: " << dValue << std::endl;
    }
    return 0;
}

0 个答案:

没有答案