Seite 1 von 1

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

Verfasst: 02.04.2012, 17:16
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?

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

Verfasst: 02.04.2012, 17:29
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);

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

Verfasst: 02.04.2012, 17:33
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!