2010-12-09 8 views
1

Ich habe die folgende Definition einer boost :: function Objekt:boost :: function und mehr Argumente Mitglied-Funktion

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

Ich bin vorbei diese Funktion als struct Konstruktorargument:

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

Jetzt muss ich die struct add_node_value_visitor an die folgende Funktion übergeben, aber die boost::function<T> akzeptiert nicht die 2 arg Member-Funktion, in der Dokumentation heißt es, ich sollte boost :: bind verwenden, aber ich bin mir jedoch nicht sicher, wie ich das tun würde , da muss ich auch meinen boost :: apply_visitor fun befriedigen 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); 

Irgendwelche Ideen jemand?

Antwort

1

Sie benötigen eine Instanz eines Zersetzer Objekt zu liefern, wie folgt aus:

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

3

Es ist schwer, genau zu sein, ohne ConcatValue Erklärung zu sehen, aber Sie wollen so etwas wie:

boost::bind(&Decomposer::ConcatValues, some_decomposer_instance, _1, _2) 
1

Die Antwort hängt davon ab, was ConcatValues wirklich ist. Ich vermute, dass es tatsächlich eine nicht-statische Member-Funktion einer Decomposer-Klasse ist, und als solche erwartet es eigentlich nicht zwei, sondern drei Parameter: zwei Zeichenfolgen und die Decomposer Instanz, auf die es aufgerufen wird (this) .

Boost.Bind ist in der Tat eine Lösung, wie es Ihnen helfen das erste Argument der Member-Funktion in einer Decomposer Instanz binden und leiten die beiden std::string bestanden:

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