c++ - 如何将 `boost::static_visitor` 实例传递给函数

标签 c++ templates boost visitor-pattern boost-variant

我正在使用 boost::variant在我的项目中经常出现。我的同事们现在想出了传递特定 boost::static_visitor<int> 实例的想法。以自定义访问类型。她有一些代码如下:

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

typedef boost::variant<int, std::string> TVar;

struct Visitor1 : public boost::static_visitor<int> {
    template<typename T> 
    result_type operator()(const T&) {
        return 42;
    }
};

struct Visitor2 : public boost::static_visitor<int> {
    template<typename T>
    result_type operator()(const T&) {
        return 21;
    }
};

 int adder(const boost::static_visitor<int>& visitor, const TVar& visitable) {
     return visitable.apply_visitor(visitor) + 1;
 }

int main(int argc, char **args) {
    Visitor1 v1;
    Visitor2 v2;
    TVar x;

    std::cout << adder(v1, x) << std::endl;
    std::cout << adder(v2, x) << std::endl;
}

它在我看来非常完美,但无法编译。我的编译器说 expression will not yield a function that takes one 1 argument某处知情人。

我们做错了什么?

最佳答案

apply_visitor 有一个仅接受访问者的重载。这将返回一个适合您需要的部分应用的函数对象,我猜:

这个重载返回一个

Class template apply_visitor_delayed_t boost::apply_visitor_delayed_t — Adapts a visitor for use as a function object.

就个人而言,我喜欢像这样向访问者对象添加重载:

struct MyVisitor {
    typedef void result_type;

    template <typename... Ts>
    result_type operator()(boost::variant<Ts...> const& v) const {
         return boost::apply_visitor(*this, v);
    }
    // optionally repeat for non-const `v`

    // normal variant handling overloads
};

这样,您可以简单地将访问者对象用作函数对象。

关于c++ - 如何将 `boost::static_visitor` 实例传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43676584/

相关文章:

c++ - <initializer_list> 引用函数

c++ - 如何在可变参数模板上生成递归数据结构?

c++ - 模板函数和 boost::remove_reference

c++ - 什么是工具类? (来自 Qt 文档的术语)

c++ - QDomDocument : setContent() return false

python - 如何在 Django 中将变量传递给模板

c++ - boost::hash/std::tr1::hash 不为复制的 const char* 返回相同的哈希值

c++ - cmake格式化字符串输出

c++ - 如何处理多个线程的重复启动?

C++ 11 模板,参数包的别名