Les expressions lambda peuvent-elles être utilisées comme paramètres de modèle de classe? (Notez que c'est une question très différente de celle-ci, qui demande si une expression lambda elle-même peut être templatisée.)
Je demande si vous pouvez faire quelque chose comme :
template
struct Foo { };
// ...
Foovoid { })> foo;
Ce serait utile dans des cas où, par exemple, un modèle de classe a divers paramètres comme equal_to
ou quelque chose du genre, qui sont généralement implémentés comme des foncteurs d'une ligne. Par exemple, supposons que je veuille instancier une table de hachage qui utilise ma propre fonction de comparaison d'égalité personnalisée. J'aimerais être capable de dire quelque chose comme :
typedef std::unordered_map<
std::string,
std::string,
std::hash,
decltype([](const std::string& s1, const std::string& s2)->bool
{ /* Implémentation personnalisée de equal_to */ })
> map_type;
Mais j'ai testé ceci sur GCC 4.4 et 4.6, et cela ne fonctionne pas, apparemment parce que le type anonyme créé par une expression lambda n'a pas de constructeur par défaut. (Je me souviens d'un problème similaire avec boost::bind
.) Y a-t-il une raison pour laquelle le projet de norme ne le permet pas, ou est-ce que je me trompe et que c'est autorisé mais que GCC est simplement en retard dans leur implémentation?