2016-03-01 6 views
5

Das folgende Dummy-Beispiel kann in der realen Welt nicht wirklich sinnvoll sein. Aber es erklärt die Frage. Ich habe eine class Foo mit Mitgliedern firstname und lastname. Die Funktion ForEachMessage benötigt ein Lambda. Ich möchte, dass es nur die firstname von Foo, aber nicht lastname erfasst. Wie erreiche ich das?Wie erfasse ich einige (aber nicht alle) Mitgliedsvariablen einer Klasse mit C++ Lambda

#include <iostream> 
#include <vector> 
#include <functional> 
using namespace std; 

vector<string> messagesList; 
void ForEachMessage(function<void(const string&)>callBack) 
{ 
    for (const auto& str : messagesList) { 
     callBack(str); 
    } 
} 

class Foo { 
public: 
    std::string firstname; 
    std::string lastname; 
    void say() { 
     ForEachMessage([this](const std::string& someMessage) 
     { 
      cout << firstname << ": " << someMessage << endl; 
     }); 

     // Error: firstname in capture list doesn't name a variable 
     // ForEachMessage([firstname](const std::string& someMessage) 
     // { 
     // cout << firstname << ": " << someMessage << endl; 
     // }); 

     // Error: expect ',' or ']' in lambda capture list 
     // ForEachMessage([this->firstname](const std::string& someMessage) 
     // { 
     // cout << firstname << ": " << someMessage << endl; 
     // }); 
    } 
}; 

int main(int argc, const char * argv[]) { 
    Foo foo; 
    foo.firstname = "Yuchen"; 
    foo.lastname = "Zhong"; 
    messagesList.push_back("Hello, World!"); 
    messagesList.push_back("Byebye, World!"); 
    foo.say(); 
    return 0; 
} 
+1

„Funktioniert nicht“ ist die am wenigsten nützliche Problembeschreibung in der Welt. – molbdnilo

+0

@molbdnilo, danke für die Kommentare. Ich habe auch die Fehlermeldung hinzugefügt. –

+1

[Schnelle Lösung] (http://coliru.stacked-crooked.com/a/131b92770d94e458). Frage mich, ob es einen besseren Weg gibt. –

Antwort

5

Sie die C++ für diese 14 Namen Capture verwenden können:

ForEachMessage([bla=firstname](const std::string& someMessage) 
    { 
     cout << bla << ": " << someMessage << endl; 
    }); 

(Siehe live) Um eine Kopie zu vermeiden, können Sie stattdessen auch per Referenz mit [&bla=firstname] erfassen. Für eine Diskussion darüber, wie man durch const& fängt, siehe this question und insbesondere this answer.

(Anmerkung:. Der lokale Name, aber nicht aus dem Mitgliedsnamen unterschiedlich sein)

+0

Jetzt ist das cool! – Nard

+2

Sieht so aus, als könntest du sogar '[& firstname = vorname]' –

+0

@SimonKraemer In der Tat hast du meine Bearbeitung sekundenschnell bewerkstelligt.Thx für die Eingabe. –

3

Erstellen Sie einen Verweis auf firstname

const std::string& rfn = firstname; 

und erfassen die Referenz

ForEachMessage([rfn](const std::string& someMessage) 
{ 
    cout << rfn << ": " << someMessage << endl; 
} 
+0

Danke für die Bearbeitung! – Nard

+0

Hoppla. Danke für die Reparatur meiner. M ( –

Verwandte Themen