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

答えは、ConcatValues実際に何があるかによって異なります。私はそれが実際にはDecomposerクラスの非静的メンバー関数であり、実際には2つではなく3つのパラメーターを期待していると推測しています.2つの文字列とDecomposerそれが呼び出されるインスタンス( this)。

Boost.Bind は、メンバー関数の最初の引数をインスタンスにバインドし、渡された 2 つを転送するのに役立つため、確かにソリューションです。Decomposerstd::string

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

次のように、Decomposer オブジェクトのインスタンスを提供する必要があります。

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

于 2010-12-09T15:24:06.720 に答える