Здравствуйте, D14, Вы писали:
D14>Так ПОКА нельзя, или вообще никогда можно не будет?
Ну может, в каком-нить C++2x.. Ибо тип auto выводится при инициализации, а параметры не инициализируются в compile-time. Это же не boost::any.
Здравствуйте, byleas, Вы писали:
B>Ну может, в каком-нить C++2x.. Ибо тип auto выводится при инициализации, а параметры не инициализируются в compile-time. Это же не boost::any.
При инициализации это как?
Так тоже нельзя.
auto f = [&](auto e){double t=1.01; e=t; std::cout << e << " " ;};
Здравствуйте, D14, Вы писали:
D14>Здравствуйте, byleas, Вы писали:
B>>Ну может, в каком-нить C++2x.. Ибо тип auto выводится при инициализации, а параметры не инициализируются в compile-time. Это же не boost::any. D14>При инициализации это как?
N2800:
7.1.6.4/1
The auto type-specifier signifies that the type of an object being declared shall be deduced from its initializer or specified explicitly at the end of a function declarator.
7.1.6.4/3
… The decl-specifier-seq shall be followed by one or more init-declarators, each of which shall have a non-empty initializer of either of the following forms:
= assignment-expression
( assignment-expression )
Здравствуйте, D14, Вы писали:
D14>Балуюсь только. Многое не очевидно, например
Ну, во-первых, каждое лямбда-выражение — это новый тип. Во-вторых, не виден контекст кода, и получилось что-то вроде мудрёного регулярного выражения (regexp), непонятно, что хотели сделать
Здравствуйте, byleas, Вы писали:
B>Ну, во-первых, каждое лямбда-выражение — это новый тип.
Ясно. Если новый тип, то выходит, что функцию, принимающая параметром лямбду продекларировать никак нельзя, значит она должна быть шаблонной.
Так обстоят дела с параметрами на вход. Но мне пока не ясно, как вернуть лямбду из функции?
Так ведь ничего не выйдет...
B>Во-вторых, не виден контекст кода, и получилось что-то вроде мудрёного регулярного выражения (regexp), непонятно, что хотели сделать
Композицию функций g(f(x))
Здравствуйте, D14, Вы писали:
D14>А так нельзя
увы
D14>
D14> std::for_each(v.begin(),v.end(),[&](auto e){std::cout << e << " " ;});
D14>
D14>Так ПОКА нельзя, или вообще никогда можно не будет?
ПОКА точно нельзя.
Лямбды, добавленные в C++0x — не полиморфные.
Если ты посмотришь в материалы комитета, там лямбды добавлены в таком виде: "(monomorphic) Lambda expressions and closures for C++" со следующей формулировкой (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2413.pdf):
This document provides wording for monomorphic (non-generic) lambda functions, which we propose
for the committee to move forward with for C++0X. The discussion on polymorphic (generic) lambda
functions is not included in this document. Following the committee’s recommendation from the
Toronto meeting (July 2007), we separate the specification of polymorphic lambda functions into a
separate (later) document. Polymorphic lambda functions can be made upwards compatible with the
non-generic lambda functions proposed here.
Там возникает достаточно много проблем, описанных, например, здесь (см. раздел "Generic lambda functions"): http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2329.pdf
Главная проблема с тем, что мы можем лямбду сохранить в переменной, а потом использовать где угодно с какими угодно аругментами.
Также у нас ведь не существует возможности объявлять обычные функции с аргументами типа auto (для этого у нас есть только шаблоны, которые проверяются во время инстанцирования, а не во время объявления).
Ведь лямбда сама по себе — это просто объект-функтор с каким-то оператором() внутри, и вся возня идет с тем, как правильно этот объект сформировать и какие аргументы должны быть у оператора(). А так же чтоб реализовывался принцип наименьшего удивления, который сейчас не выполняется для шаблонов — ты объявил шаблон, ошибок не получил, потом заюзал его в каком-то далеком метсе и получил миллион ошибок из мест, о существовании которых ты и не подозревал.
Понятно, что в каком-то виде это все будет разрешено и у нас будут полиморфные лямбды (а может, auto в параметре будет обобщен и до обычных функций), но по соображениям синицы в руках (релиза стандарта в 2009-2010), у нас пока что будут только мономорфные лямбды.
Здравствуйте, D14, Вы писали:
D14>Здравствуйте, byleas, Вы писали:
B>>Ну, во-первых, каждое лямбда-выражение — это новый тип. D14>Ясно. Если новый тип, то выходит, что функцию, принимающая параметром лямбду продекларировать никак нельзя, значит она должна быть шаблонной. D14>Так обстоят дела с параметрами на вход. Но мне пока не ясно, как вернуть лямбду из функции? D14>Так ведь ничего не выйдет... D14>
Здравствуйте, jazzer, Вы писали:
J>Понятно, что в каком-то виде это все будет разрешено и у нас будут полиморфные лямбды (а может, auto в параметре будет обобщен и до обычных функций), но по соображениям синицы в руках (релиза стандарта в 2009-2010), у нас пока что будут только мономорфные лямбды.
Из соображений синицы в руках, почему бы для начала анонимные классы не ввести, как в Java. По-моему не сложно было бы реализовать.
Здравствуйте, D14, Вы писали:
D14>Здравствуйте, jazzer, Вы писали:
J>>Понятно, что в каком-то виде это все будет разрешено и у нас будут полиморфные лямбды (а может, auto в параметре будет обобщен и до обычных функций), но по соображениям синицы в руках (релиза стандарта в 2009-2010), у нас пока что будут только мономорфные лямбды.
D14>Из соображений синицы в руках, почему бы для начала анонимные классы не ввести, как в Java. По-моему не сложно было бы реализовать.
А чем это отличается от локальных классов и чем это лучше лямбды? (ведь определяешь не весь класс, а только функцию (читай, оператор вызова))
Здравствуйте, byleas, Вы писали:
B>А чем это отличается от локальных классов и чем это лучше лямбды? (ведь определяешь не весь класс, а только функцию (читай, оператор вызова))
— ИМХО просто встроить в язык.
— отсутствует проблема указанием типа параметра функции (хотя к сильному сокращению объема кода это не приведет).
— не является first-сlass object, не надо принимать на вход и возвращать. С лямбдами есть какой-то спец. тип function<int(int)> .
Здравствуйте, D14, Вы писали:
D14>Посмотрю матчасть по этому вопросу подробнее, но на практике пользоваться этим пока нельзя. D14>Такой пример вылетает с access violation.
У меня всё работает в VC++ 2010. function<> не из boost'а а из <functional> (C++0x).