Можно ли использовать лямбда-выражения в качестве параметров шаблона класса? (Обратите внимание, что это совсем другой вопрос, чем этот, который спрашивает, может ли быть шаблонное выражение сам по себе.)
Я спрашиваю, можете ли вы сделать что-то вроде:
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 просто отстает в их реализации?