Lambda in c++

krgewb

Top Contributor
Ich habe eine benannte Lambda-Funktion namens fun.
C++:
const auto fun = [this](const data::video_source& device) -> Poco::JSON::Object::Ptr
{
...
}

Hier wird sie aufgerufen:
C++:
const auto& json = accumulate(id_lst, fun);

Ich verstehe nicht, woher device kommt. Da steht doch nur fun. Es wird nichts übergeben.

PS:
Hier ist noch die accumulate-Funktion:

C++:
std::string
DeviceConfigHelper::accumulate(
        const std::vector<unsigned long>& id_lst,
        std::function<Poco::JSON::Object::Ptr(const data::video_source& device)> fun) const
{
...
}
 

krgewb

Top Contributor
Ich habe die Stelle gefunden, in der die Magie geschieht. In accumulate steht:
C++:
const auto& device = _view_mapping.find(view_id)->second;
futures.push_back(std::async(std::launch::async, fun, device));
 

KonradN

Super-Moderator
Mitarbeiter
Ich bin mir jetzt gerade nicht ganz sicher, was Dein Problem ist. Du hast die Definition von fun.

In der Lambda Funktion hast Du ja die Definition:
[ capture_clause ] ( parameters ) -> return_type { function_body }

Das data::video_source& device ist somit nur der Parameter. Wenn Du fun aufrufst, dann musst Du ein Device mitgeben.


Bei dem accumulate(id_lst, fun); wird fun nicht aufgerufen. Du übergibst diese Lambda-Funktion nur. Das ist also nur ein Parameter. Ebenso bei dem futures.push_back(std::async(std::launch::async, fun, device));

Dieses futures.push_back sorgt aber unter dem Strich jetzt dazu, dass fun mit dem Parameter device aufgerufen wird.

Hier evtl. zum Verständnis einfach ein kleines Beispiel für so ein future.push_back, das ich von ChatGPT mal generiert habe:
C++:
#include <future>
#include <vector>
#include <iostream>
#include <thread>

// Eine einfache Funktion, die etwas Arbeit simuliert
int do_some_work(int x) {
    std::this_thread::sleep_for(std::chrono::seconds(1)); // Arbeit simulieren
    return x * 2;
}

int main() {
    std::vector<std::future<int>> futures;

    // Starten einiger asynchroner Aufgaben und Speichern der futures
    for(int i = 0; i < 5; ++i) {
        futures.push_back(std::async(std::launch::async, do_some_work, i));
    }

    // Ergebnisse abfragen
    for(auto &f : futures) {
        std::cout << "Ergebnis: " << f.get() << std::endl; // Wartet auf das Ergebnis und gibt es aus
    }

    return 0;
}

Hilft Dir das bei dem Verständnis etwas weiter? Oder an welcher Stelle hast Du genau das Verständnisproblem?

Ich muss an der Stelle aber gestehen, dass ich in erster Linie nur Java entwickle. (Und dann eher C#). Mein C++ ist in erster Linie auf C++98 stehen geblieben - neuere Dinge kenne ich nur vom Lesen aber habe da keine große Projekterfahrungen mit. Also auch die C++11 Standards mit Lambda Funktionen sind garantiert keine Stärke von mir und mein Verständnis / meine Erklärungen mögen daher auch nicht korrekt sein. Aber das ist, was ich so bisher gelesen und verstanden habe. Aber ich kann bei so Themen auch immer gerne anbieten, beim Buch "Der C++ Programmierer" (Meine Ausgabe deckt bis C++17 ab) die entsprechenden Abschnitte nachzulesen und entsprechende Informationen zu liefern.
 

Neue Themen


Oben