Есть ли в C ++ 11 способ шаблонизировать лямбда-функцию? Или он слишком специфичен для шаблонов?
Я понимаю, что вместо этого я могу определить классический шаблонный класс / функтор, но вопрос скорее похож на: позволяет ли язык создавать шаблоны лямбда-функций?
ОБНОВЛЕНИЕ 2018: C++20 будет поставляться с шаблонными и концептуальными лямбда-выражениями. Эта функция уже интегрирована в стандартную версию.
ОБНОВЛЕНИЕ 2014: C++14 был выпущен в этом году и теперь предоставляет полиморфные лямбда-выражения с тем же синтаксисом, что и в этом примере. Некоторые крупные компиляторы уже реализуют его.
На данный момент (в C++11), к сожалению, нет. Полиморфные лямбды были бы превосходны с точки зрения гибкости и мощности.
Первоначальная причина, по которой они оказались мономорфными, заключалась в концепциях. Концепции усложнили эту ситуацию с кодом:
template <Constraint T>
void foo(T x)
{
auto bar = [](auto x){}; // imaginary syntax
}
В шаблоне с ограничениями вы можете вызывать только другие шаблоны с ограничениями. (В противном случае ограничения нельзя было бы проверить.) Может ли foo
вызывать bar(x)
? Какие ограничения имеет лямбда (в конце концов, параметр для нее — это всего лишь шаблон)?
Концепты не были готовы решать такие вещи; для этого потребуется больше вещей, таких как late_check
(где концепция не проверялась до вызова) и тому подобное. Проще было просто бросить все это и придерживаться мономорфных лямбда-выражений.
Однако с удалением понятий из C++0x полиморфные лямбды снова становятся простым предложением. Однако я не могу найти никаких предложений для него. :(