Boost-Funktion und boost bind: Binden Sie den Rückgabewert?
Dies ist im Zusammenhang mit dieser vorhergehenden Frage: Mit boost::bind, boost::function: abrufen der gebundenen variable Typ.
Kann ich binden, eine Funktion wie diese:
in .h:
class MyClass
{
void foo(int a);
void bar();
void execute(char* param);
int _myint;
}
in .cpp
MyClass::bar()
{
vector<boost::function<void(void)> myVector;
myVector.push_back(boost::bind(&MyClass::foo, this, MyClass::_myint);
}
MyClass::execute(char* param)
{
boost::function<void(void)> f = myVector[0];
_myint = atoi(param);
f();
}
Aber wie kann ich binden einen Wert zurück ? also:
in .h:
class MyClass
{
double foo(int a);
void bar();
void execute(char* param);
int _myint;
double _mydouble;
}
in .cpp
MyClass::bar()
{
vector<boost::function<void(void)> myVector;
//PROBLEM IS HERE: HOW DO I BIND "_mydouble"
myVector.push_back(boost::bind<double>(&MyClass::foo, this, MyClass::_myint);
}
MyClass::execute(char* param)
{
double returnval;
boost::function<void(void)> f = myVector[0];
_myint = atoi(param);
//THIS DOES NOT WORK: cannot convert 'void' to 'double'
//returnval = f();
//MAYBE THIS WOULD IF I COULD BIND...:
//returnval = _mydouble;
}
- Sie haben eine
function<void(void)>
-- wo erwarten Sie eindouble
zu kommen, in diese überhaupt? Wenn Sie möchten, eine nullaryfunction<>
gibt einedouble
versuchenfunction<double()>
... - Blick auf die Letzte Zeile des
bar
Funktion, das ist wie das input-argument gebunden ist, die Funktion Typ ist gelöscht und wirdfunction<void(void>>
aber_myint
ist noch verlinkt.. ich will das gleiche für den Rückgabewert. Der Punkt ist, um in der Lage zu speichern, die boost::Funktionen in den gleichen Vektor 😉 - Aber Sie haben ausdrücklich angegeben, dass Sie wollen
void
als Rückgabewert (function<void(void)>
); entweder Sie wollenvoid
oder möchten Siedouble
Sie können nicht beides haben. - Ich Stimme zu, dass
returnval = f();
nicht funktionieren sollte, aber es sollte ein Weg gefunden werden, binden Sie den Rückgabewert, so wie es auch eine Möglichkeit zum binden der input-Wert... - Nein, Zu Steigern.Binden bindet Funktionen und Parameter. Die Ausführung der Funktion und der resultierende Rückgabe eines Wertes ist genau das gleiche wie wenn Sie aufgerufen, eine reguläre Funktion.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn das, was Sie wollen, ist eine nullary Funktion zurückgibt, die
void
sondern weist einen Wert zu_myDouble
mit dem Ergebnisfoo()
bevor Sie dies tun, dann können Sie dies leicht tun mit nur Boost.Binden. Aber Boost ist eine Bibliothek, die speziell kümmerten sich um diese Art der Sache -- Boost.Phoenix:problem 1:
myVector
werden muss, um eine Klasse Mitglied.problem 2:
myVector
interessiert-Funktionen, die Rückkehr verdoppelt und nehmen keine Argumente, das wäreboost::function<double()>
dann, zu binden _mydouble, um die parameter von foo, rufen Sie
boost::bind(&MyClass::foo, this, MyClass::_mydouble)
die Ihnen zu einer Compilerwarnung über die Umwandlung eines double in einen int, wenn foo aufgerufen wird.Die nächstgelegene Sie kommen können, mit Boost.Binden, ist die Bereitstellung der toreturn als parameter.
boost::function<double(void)>
Bitte nicht weitergeben diese hässlichen C-ism, lieberboost::function<double()>
.<void(void)>
Funktionen