2016-06-10 6 views
1

Wie kann ich den folgenden Code ändern, um eine schwache_ptr anstelle von shared_ptr zu verwenden und behalten Sie die Fähigkeit, Methodenname anzugeben (wie in Std :: Bind getan)? Es scheint, dass std :: bind schwacher_ptr nicht unterstützt, da er den weak_ptr überprüfen muss.Wie kombiniere ich mit functor mit bind und weak_ptr

void foo::a() 
{ 
    m_class.do1(
    std::function<void(int)>(
     std::bind(&foo::b, shared_from_this(), std::placeholders::_1))); 
} 

void foo::b(int i) 
{ 
} 
+0

Was würden die Semantik dieser hypothetischen bindage sein? –

+0

Nicht sicher, ich verstehe die Frage. Wir möchten, dass der Funktor aufgerufen wird, wenn weak_ptr :: lock einen gültigen shared_ptr zurückgibt. – Lars

+0

Und was würden Sie tun, wenn lock() keinen gültigen gemeinsamen Zeiger zurückgibt? –

Antwort

3

können Sie Lambda verwenden:

void foo::a() 
{ 
    std::weak_ptr<foo> w {shared_from_this()}; 
    auto l = [w](int i) { 
     auto ptr = w.lock(); 
     if (ptr) { 
      ptr->b(i); 
     } 
    }; 
    m_class.run(l); 
} 
+0

Das sieht interessant aus. Wird einige Tests machen. – Lars

+0

Sie können die Variable 'ptr' lokal für die if-Anweisung definieren. –

Verwandte Themen