[C++] Lambda-Ausdrücke als Template-Parameter

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 5162
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

[C++] Lambda-Ausdrücke als Template-Parameter

Beitrag von Schrompf »

Hallo erneut,

eine Kleinigkeit, die mir gerade etwas Stirnrunzeln verursacht hat: ich wollte für ein std::unordered_set einen eigenen Hasher und Comparer angeben. Ich dachte, ich könnte da einfach Lambdas für einsetzen, so etwa in der Art:

Code: Alles auswählen

auto meinHäsch = [&](const Typ& t) { return size_t( ...); }
auto meinVergleich = [&](const Typ& t1, const Typ& t2) { return 2b || !2b; }

std::unordered_set<Typ, meinHäsch, meinVergleich> pfft;
Geht nicht, weil... tja, hier hört mein Verständnis auf. Laut Doku kann ich dort einen Ausdruck angeben, der das Konzept () erfüllt. Geht aber nicht, weil es Typen und keine Instanzen sein dürfen. Ich habe es dann wie folgt abgeändert:

Code: Alles auswählen

std::unordered_set<Typ, decltype( meinHäsch), decltype( meinVergleich)> pfft;
... und ich kam mir dabei furchtbar clever vor. Damit ändert sich die Fehlermeldung zu "No default constructor available". Grmpf. Jetzt hab ich den Code doch in Funktoren verpackt und jetzt meckert VS nur noch darüber, dass die Funktoren lokal definiert sind.

Gibt es dafür eine elegante Standardlösung?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [C++] Lambda-Ausdrücke als Template-Parameter

Beitrag von CodingCat »

Naja, du bist vermutlich gar nicht mehr so weit weg mit deiner unteren Lösung. Der Typ alleine reicht nur logischerweise nicht, du musst deine Lambda-Objekte schon auch noch mitgeben:

Code: Alles auswählen

std::unordered_set<Typ, decltype( meinHäsch), decltype( meinVergleich)> pfft(N0, meinHäsch, meinVergleich);
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Schrompf
Moderator
Beiträge: 5162
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [C++] Lambda-Ausdrücke als Template-Parameter

Beitrag von Schrompf »

CodingCat hat geschrieben:Naja, du bist vermutlich gar nicht mehr so weit weg mit deiner unteren Lösung. Der Typ alleine reicht nur logischerweise nicht, du musst deine Lambda-Objekte schon auch noch mitgeben:

Code: Alles auswählen

std::unordered_set<Typ, decltype( meinHäsch), decltype( meinVergleich)> pfft(N0, meinHäsch, meinVergleich);
Ah, Erkenntnis! Die Lambdas haben ja ein Rudel unsichtbarer Konstruktor-Parameter, weil ich sie mit [&] definiert habe. Demzufolge kann ich da nicht die Default-Werte für die Parameter benutzen. Danke für die schnelle Hilfe!
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten