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
Susan SarandonOriginal
2024-12-17 21:04:10467Durchsuche

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;
}

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; });

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

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

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);

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;
}

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!

Stellungnahme:
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