Можно ли создавать шаблоны лямбда-функций?

Есть ли в C ++ 11 способ шаблонизировать лямбда-функцию? Или он слишком специфичен для шаблонов?

Я понимаю, что вместо этого я могу определить классический шаблонный класс / функтор, но вопрос скорее похож на: позволяет ли язык создавать шаблоны лямбда-функций?

210
задан Peter Mortensen 29 May 2014 в 02:08
поделиться

1 ответ

ОБНОВЛЕНИЕ 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 полиморфные лямбды снова становятся простым предложением. Однако я не могу найти никаких предложений для него. :(

166
ответ дан 23 November 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: