Heim > Backend-Entwicklung > C++ > Warum leitet C 11 bei der Verwendung von Lambda-Funktionen mit Funktionsvorlagen keine Typen ab?

Warum leitet C 11 bei der Verwendung von Lambda-Funktionen mit Funktionsvorlagen keine Typen ab?

Susan Sarandon
Freigeben: 2024-12-17 21:04:10
Original
454 Leute haben es durchsucht

Why Doesn't C  11 Deduce Types When Using Lambda Functions with Function Templates?

C 11 leitet keinen Typ ab, wenn Funktionen oder Lambda-Funktionen beteiligt sind

Bei der Verwendung von C 11-Vorlagen oder Lambda-Funktionen ist es wichtig zu verstehen, wie die Typableitung funktioniert. In Fällen, in denen Sie eine Funktionsvorlage definieren, die eine std::function- oder Lambda-Funktion akzeptiert, kann der Compiler den Vorlagentyp möglicherweise nicht automatisch ableiten.

Betrachten Sie beispielsweise die folgende Funktion:

template<class A>
set<A> filter(const set<A>& input, function<bool(A)> compare) {
    set<A> ret;
    for(auto it = input.begin(); it != input.end(); it++) {
        if(compare(*it)) {
            ret.insert(*it);
        }
    }
    return ret;
}
Nach dem Login kopieren

Wenn Sie versuchen, diese Funktion direkt mit einer Lambda-Funktion aufzurufen, kann es zu einem Fehler kommen. Dies liegt daran, dass der Compiler den Vorlagentyp nicht allein aus der Lambda-Funktion ableiten kann:

set<int> myNewSet = filter(mySet,[](int i) { return i%2==0; });
Nach dem Login kopieren

Dieser Fehler kann vermieden werden, indem der Vorlagentyp explizit angegeben wird:

set<int> myNewSet = filter<int>(mySet,[](int i) { return i%2==0; });
Nach dem Login kopieren

Alternativ können Sie dies tun Konvertieren Sie die Lambda-Funktion in ein std::function-Objekt:

std::function<bool(int)> func = [](int i) { return i%2 ==0; };
set<int> myNewSet = filter(mySet,func);
Nach dem Login kopieren

In Fällen, in denen Sie eine Reihe von Werten basierend auf einem Vergleich filtern müssen Funktion können Sie eine allgemeinere Lösung bereitstellen, indem Sie eine Funktionsvorlage erstellen, die einen CompareFunction-Typ akzeptiert:

template<class Value,class CompareFunction>
set<Value> filter(const set<Value>& input,CompareFunction compare) {
    set<Value> ret;
    for(auto it = input.begin(); it != input.end(); it++) {
        if(compare(*it)) {
            ret.insert(*it);
        }
    }
    return ret;
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum leitet C 11 bei der Verwendung von Lambda-Funktionen mit Funktionsvorlagen keine Typen ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage