1

我对 boost::function 对象有以下定义:

typedef boost::function<std::string (std::string, std::string)> concat;

我将此函数作为结构构造函数参数传递:

struct add_node_value_visitor : boost::static_visitor<>
{
    typedef boost::function<std::string (std::string, std::string)> concat;
    add_node_value_visitor(concat _func, std::string key) : _func_concat(_func), _key(key) {}

    template <typename T>
    void operator() ( const T& value) const
    {
        std::string result = _func_concat(boost::lexical_cast<std::string, T>(value), _key);
    }

    std::string _key;
    concat _func_concat;
};

现在我需要将 传递struct add_node_value_visitor给以下函数,但是boost::function<T>不接受 2 arg 成员函数,在文档中说我应该使用 boost::bind,但是我不确定我会怎么做,看到我还必须满足我的 boost::apply_visitor 功能。

boost::apply_visitor( add_node_value_visitor( &Decomposer::ConcatValues, key), var); // ConcatValues takes 2 args, var = boost::variant


std::string ConcatValues(std::string str, std::string key);

有什么想法吗?

4

3 回答 3

3

如果没有看到 ConcatValue 的声明,很难准确地说,但你想要这样的东西:

boost::bind(&Decomposer::ConcatValues, some_decomposer_instance, _1, _2)
于 2010-12-09T15:21:56.310 回答
1

您需要提供一个 Decomposer 对象的实例,如下所示:

boost::apply_visitor( add_node_value_visitor( boost::bind( &Decomposer::ConcatValues, yourDecomposer, _1, _2 ), key), var);

于 2010-12-09T15:24:06.720 回答
1

答案取决于ConcatValues实际情况。我猜它实际上是一个Decomposer类的非静态成员函数,因此它实际上并不需要两个而是三个参数:两个字符串和Decomposer调用它的实例(this)。

Boost.Bind 确实是一个解决方案,因为它将帮助您将成员函数的第一个参数绑定Decomposer到一个实例,并转发两个std::string传递的:

Decomposer decomposer;
boost::apply_visitor(
   add_node_value_visitor(boost::bind(&Decomposer::ConcatValues, &decomposer, _1, _2), var
);
于 2010-12-09T16:27:49.043 回答