boost :: function и функция-член с несколькими аргументами - PullRequest
1 голос
/ 09 декабря 2010

У меня есть следующее определение объекта 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> не принимает функцию-член 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);

Есть какие-нибудь идеи?

Ответы [ 3 ]

3 голосов
/ 09 декабря 2010

Трудно быть точным, не увидев декларацию ConcatValue, но вы хотите что-то вроде:

boost::bind(&Decomposer::ConcatValues, some_decomposer_instance, _1, _2)
1 голос
/ 09 декабря 2010

Ответ зависит от того, что на самом деле является 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
);
1 голос
/ 09 декабря 2010

Вам необходимо предоставить экземпляр объекта Decomposer, например:

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

...