2010-12-09 55 views
1

我有一个提升的定义如下::函数对象:的boost ::功能和多参数成员函数

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乐趣ction。

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); 

任何想法任何人?

回答

1

您需要提供了分解剂对象的实例,就像这样:

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

3

很难被没有看到ConcatValue的声明精确,但你想要的东西,如:

boost::bind(&Decomposer::ConcatValues, some_decomposer_instance, _1, _2) 
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 
);