Boost::Thread und member-Funktionen
-
Das war doch ein Beispiel. Oder meinst du mit boost::bind?
-
314159265358979 schrieb:
Wenn du C++11 hast, würde ich eine Lambda nehmen
Manche Anwendungen von Lambdas sollte man bleiben lassen.
Dies ist ein klarer Fall fürstd::bind(&A::funcB, this).
-
Lambdas sind kürzer, besser lesbarer und weniger fehleranfällig als bind. Insbesondere, wenn dann die placeholders ins Spiel kommen.
-
kopfschüttler schrieb:
314159265358979 schrieb:
Wenn du C++11 hast, würde ich eine Lambda nehmen
Manche Anwendungen von Lambdas sollte man bleiben lassen.
Dies ist ein klarer Fall fürstd::bind(&A::funcB, this).Danke für die Antwort, jetzt sollte es funktionieren

mfg D3lta
P.S.: Es muss boost::bind() heißen.

-
Sobald du Placeholder verwendest, wirst du bereuhen, bind verwendet zu haben. Versprochen.
-
314159265358979 schrieb:
Insbesondere, wenn dann die placeholders ins Spiel kommen**, ist bind massiv lesbarer**.
FTFY.
Sobald das Lambda Parameter entgegen nimmt hat hat die Lesbarkeit verloren. Dann ist bind kürzer, besser lesbar und weniger fehleranfällig. Nur weil du es nicht verstanden hast, muss es nicht schlecht sein.PS: std::bind ist C++11, wie die Lambdas.
-
rofl
-
Was sind denn Placeholders?
Und wie kann ich meiner Funktion Argumente übergeben?mfg D3lta
-
gnihihi
-
314159265358979 schrieb:
gnihihi
Was ist?

mfg D3lta
-
@pi: Was ist da wohl schöner?
struct S { bool foo(const char *str, int arg) { return std::cout << str << ": " << arg << '\n'; } } s; boost::bind(&S::foo, s, _1, 5)("hallo"); [&s] (const char *str) -> bool { return s.foo(str, 5); } ("hallo");@D3lta: Einfach bind einen weiteren Parameter übergeben?
-
kopfschüttler schrieb:
@pi: Was ist da wohl schöner?
struct S { bool foo(const char *str, int arg) { return std::cout << str << ": " << arg << '\n'; } } s; boost::bind(&S::foo, s, _1, 5)("hallo"); [&s] (const char *str) -> bool { return s.foo(str, 5); } ("hallo");@D3lta: Einfach bind einen weiteren Parameter übergeben?
Bin für das erste

Aber auch nur, weil ich von Lambda keine Ahnung habe
Fehlt nur noch, dass jemand mir erklärt was Placeholders sind
mfg D3lta
-
Warum so kompliziert? Wenn die Klasse ein "callable" Interface anbietet, sprich: operator() überlädt, reich boost::thread doch this, zumindest laut boost Dokumentation. Oder übersehe ich da was?
#include <boost/thread/thread.hpp> class A { private: int i; public: void funcA() { i=1; boost::thread th(*this, 42, "Hello"); } void operator()(int i, string j) { i++; } }; int main() { A a; a.funcA(); return 0; }
-
Ich weiß jetzt nicht, wie es bei Boost aussieht, aber ein std::thread darf man nicht einfach erzeugen und wieder zerstören ohne .join oder .detatch (falls es das noch gibt) aufgerufen zu haben.
Und die std::thread akzeptiert sogar Memberfunktionszeiger:
class foo { public: void bar(double); }; int main() { foo f; std::thread t (&foo::bar,&f,2.71828); t.join(); }(ungetestet)
oder man schreibt gleich
class foo { public: void bar(double); }; int main() { foo f; auto futr = std::async(&foo::bar,&f,2.71828); futr.get(); }(ungetestet)
-
314159265358979 schrieb:
Sobald du Placeholder verwendest, wirst du bereuhen, bind verwendet zu haben. Versprochen.
Belege? (Interessiert micht wirklich, ich hab schon einiges mit placeholder gemacht)
Einfach nur den Leuten kurze Phrasen an den Kopf zu werfen, erhöht zwar deinen Post Count, lässt dich aber nicht erfahrener wirken

Auch boost::thread lässt sich mittlerweile ohne bind konstruieren: http://www.boost.org/doc/libs/1_47_0/doc/html/thread/thread_management.html#thread.thread_management.thread.callable_constructor
-
pi_herausforderer schrieb:
Belege? (Interessiert micht wirklich, ich hab schon einiges mit placeholder gemacht)
Die Fehlermeldungen sind ekelhaft.
-
ogni42 schrieb:
Oder übersehe ich da was?
Ja, du übersiehst, dass das Argument kopiert wird, d.h. du übergibst eine Kopie von *this an den Thread, was nicht ist, was der OP möchte.
@ Lambdas vs. bind: keins von beidem sondern tatsächlich den variadic Konstruktor von std::thread nutzen.
kopfschüttler schrieb:
@pi: Was ist da wohl schöner?
struct S { bool foo(const char *str, int arg) { return std::cout << str << ": " << arg << '\n'; } } s; boost::bind(&S::foo, s, _1, 5)("hallo"); [&s] (const char *str) -> bool { return s.foo(str, 5); } ("hallo");In dem Fall das lambda, nur ohne den überflüssigen trailing returntype:
auto func = [&s](char const* str) {return s.foo(str,5);}; func("hallo");
-
kopfschüttler schrieb:
Dies ist ein klarer Fall für
std::bind(&A::funcB, this).Das sehe ich nicht so. Was soll denn an
std::bind(&A::funcB, this)viel besser sein als bei
[this]{funcB();}?
Das Blöde bei dem Funktionszeigern ist noch, dass das nicht so schön funktioniert, wenn die Funktionen überladen sind. Mit Einzug von Move Semantics ist schon so mancher Elementfunktionszeiger-verwendender C++ Code kaputt gegangen, weil plötzlich so'was wie push_back überladen ist. Da ist das mit den Lambdas dagegen (zumindest in diesem Fall) eher schmerzfrei.
Außerdem, wenn du schon std::bind verwendest, kannst Du auch gleich den variadischen Konstruktor von std::thread ausnutzen. Dadurch wird ein
bindauch überflüssig und es werden sogar move-only-Parameter korrekt unterstützt.