Можно ли использовать лямбда-выражения в качестве параметров шаблона класса?(Обратите внимание, что это совсем другой вопрос, чем этот , который спрашивает, может ли быть задано само лямбда-выражение.)
Я спрашиваю, можете ли вы сделать что-то вроде:
template <class Functor>
struct Foo { };
// ...
Foo<decltype([]()->void { })> foo;
Это было бы полезно в тех случаях, когда, например, шаблон класса имеет различные параметры, такие как equal_to
или что-то еще, которые обычно реализуются в виде однострочных функторов.Например, предположим, что я хочу создать хеш-таблицу, в которой используется моя собственная функция сравнения на равенство.Я хотел бы иметь возможность сказать что-то вроде:
typedef std::unordered_map<
std::string,
std::string,
std::hash<std::string>,
decltype([](const std::string& s1, const std::string& s2)->bool
{ /* Custom implementation of equal_to */ })
> map_type;
Но я проверял это на GCC 4.4 и 4.6, и это не работает, очевидно, потому что анонимный тип, созданный лямбда-выражением, не 'не имеет конструктора по умолчанию.(Я помню похожую проблему с boost::bind
.) Есть ли какая-то причина, по которой проект стандарта не позволяет этого, или я ошибаюсь, и это разрешено, но GCC отстает в своей реализации?