2009-08-03 2 views
8

В последнее время я очень волнуюсь за поддержку лямбда в VC2010. Я постепенно начинаю понимать весь потенциал этой функции в преобразовании C++ во что-то гораздо лучше.Планы библиотек для C++ 0x?

Но потом я понял, что этот потенциал сильно зависит от поддержки основного потока lambdas в повседневных библиотеках, таких как boost и QT.
Кто-нибудь знает, планируют ли расширить эти библиотеки новыми функциями C++ 0x?

lambdas практически заменяет потребность в boost :: лямбда и все в повышении, которое взаимодействует с ним. QT может добавить поддержку лямбды во всех их контейнере и, возможно, даже в качестве альтернативного способа определения SLOT сек

+1

'повышение :: bind' цели еще одна вещь, не замененные на лямбды. 'std :: bind' выполнит свою работу по связыванию функций. Вместо этого lambdas частично заменит функциональность в 'boost :: lambda' (и ее преемнике, boost :: phoenix, afaik). То, что лямбды в настоящее время не могут сделать, это полиморфизм 'boost :: lambda'.Возможность создавать функции, которые работают с любым типом аргумента: '_1 ++' увеличивает любой тип аргумента, а '[] (int & a) {a ++; } 'может только увеличивать int. Я слышал, что концепции из C++, полиморфные лямбды снова являются опцией. –

+1

@litb - это интересно, есть ли у вас какие-либо ссылки на материал, объясняющий, почему концепции были блокпостом для лямбда с параметрами типа? –

+0

Я не знаю документа, который подробно обсуждает его, но я читал это на usenet. Я предполагаю, что должен был быть способ сказать: 'требует Blah [] (T t) {...}' или что-то вроде этого, чтобы сделать шаблон 'operator()' lambda ограниченным. Другая проблема может заключаться в том, что в ограниченном шаблоне вы можете вызывать только другие ограниченные шаблоны, чтобы разрешить проверку шаблона. Таким образом, с лямбдой, имеющей простой непокрытый шаблонный 'operator()', вы не могли бы использовать это в ограниченном шаблоне следующим образом: 'template void f (T t) {([] (u) {...}) (т); } '. –

ответ

6

Lambdas уже хорошо вписывается в существующие библиотеки - везде, где функция принимает объект функции типа, заданного параметром шаблона.

Это одна из замечательных вещей о них - это классический пример языковой функции, которая кодирует существующую практику в отличном синтаксисе.

Очевидно, что лямбда-библиотека повышения становится излишней, но это означает, что ей не нужны никакие новые функции, которые будут добавлены к ней.

+0

Комментарий от спутника может быть интересным (но опять же, возможно, это не так). –

+0

Хех, это то, что ваш куки-резак прокомментировал комментарий? : P – GManNickG

3

Шансов таких библиотек собираются ждать, пока нет надлежащей поддержки компилятора для соответствующего C++ 0x функций, и не потрудитесь с ним, пока основные компиляторы не поддержат его. Не задерживайте дыхание.

4

Я не вижу, как использование лямбда зависит от поддержки со стороны библиотек. Lambdas устраняет необходимость создания множества классов, чтобы обернуть различные небольшие алгоритмы и аккуратно сочетаться с другими языковыми и библиотечными функциями (std::function придет на ум). Где бы вы ни использовали объект функции или указатель на функцию, также можно использовать lambdas.

Таким образом, они в основном добавляют другую альтернативу для использования существующего кода и библиотек. Единственный способ, которым я могу видеть библиотеки для лучшей поддержки лямбда, - использовать более функциональные подходы.

0

Большинство библиотек используют стандартные указатели функций для обратных вызовов. C++ 0x lambdas можно использовать как указатели на функции, поэтому большинство библиотек не нужно будет изменять. Другие библиотеки используют шаблоны, чтобы они могли принимать любой вызываемый объект (например, std::foreach не нужно было изменять).

Единственная другая функция C++ 0x, о которой я могу думать о том, что библиотеки могут изменить, - это использование строго типизированного enums. Кроме того, библиотеки могут начать использовать шаблоны extern, чтобы сократить время компиляции.

+3

Ссылки на r-значение будут (или должны) иметь большое влияние - у многих библиотек есть классы, которые служат в качестве оберток вокруг дорогостоящих ресурсов, а добавление операций перемещения мгновенно ускоряет многие программы, написанные с такими библиотеки (или сделать правильные программы более читаемыми). –

+0

А, да, я забыл о ссылках на R-значение. Я предполагаю, что они будут использоваться много в таких библиотеках, как Boost, но не столько в таких прикладных библиотеках, как Qt.Кроме того, в большинстве случаев он не нарушит интерфейс, поэтому вам никогда не придется беспокоиться о них (кроме использования их в вашем собственном коде). – Zifre

+1

Вы не можете назначить результат выражения лямбда указателю функции. – sellibitze

1

Это НЕправда, вы не можете заменить boost :: lambda на C++ 0x lambda. См. here по некоторым причинам (об усилении привязки, но я думаю, что большая его часть переносит)

Кроме того, @daniel this может помочь вам приступить к работе с использованием лямбда-функций/усилить привязку для слотов. Это делает мою жизнь невероятно легкой.

Кроме того, @litb из моих источников, лямбды не будет изменен (Argh)

+0

спасибо за ссылку cheez! –

+0

относительно уродливой проблемы закрытия над переменной цикла и необходимости сделать копию. Вместо этого используйте 'for_each' для прокрутки 'vector '. Передайте ему лямбду, чтобы действовать как «цикл цикла», то есть 'for_each (d.begin(), d.end(), [&] (int i) {/ loop тело идет сюда * /});' Теперь что 'i' теперь можно безопасно захватить по значению, поскольку оно уже является копией, и поэтому внутри цикла вы скажете' funcs.push_back ([=]() {return i + 5;}); '. Та же проблема/решение возникает в C# и JavaScript. –

Смежные вопросы