Первая посылка: компилятор вам заявляет «дружище, что бы у тебя в качестве result_type не было определено, но sizeof я для этого сделать никак не могу».
Вторая посылка: обычно компиляторы не испытывают проблем с sizeof(int).
Вывод: result_type не является типом int.
«If the expression parameter is a call to a function...» — означает «Если вы в скобочках написали что-то, что похоже на вызов ф-ции...».
А вызов ф-ции/функтора обычно выглядит как применение оператора скобочки для объекта ф-ции/функтора (т.е. func()), а не чистое написание типа ф-ции/функтора (LambdaFunc).
Все просто: x — это ленивый генератор ленивых функторов :).
Когда от него просят x[i], и в своем контейнере функторов для i у него ничего нет — он делает ленивый функтор и сохраняет его в контейнер. Функторы знают свой индекс и знают X, у которого могут запрашивать доступ к соседям.
И вся эта чехарда, чтобы написать что-то вроде: for (unsigned i = 0; ( x[i + 1]() - x[i]() ) >= eps; ++i);
Не собирается, потому что decltype(LambdaFunc) — это совсем не то. Для того там и стрелочка чтобы написать decltype(func()) — т.е. тип, который бы вернул объект(функтор) func, в ответ на свою операцию скобочки.
Стрелочка для того чтобы перенести определение возвращаемого значения ф-ции правее, в то место, где входной параметр ф-ции, объект func уже определен и может нам сказать, что он возвращает на операцию скобочки.
А decltype(LambdaFunc) — это идентично просто написать LambdaFunc, или даже просто не имеет значения.
Спасибо за наводку, но это не совсем то.
Насколько я понял, std::future делает вычисления в параллельном потоке, и начинает сразу (т.е. нифига не ленится :)).
Ее стоит использовать, когда вам гарантировано понадобится результат, но вы хотите, пока он считается, заняться чем-нибудь другим.
Совсем такое только компилятор может обеспечить.
С функтором немного сложнее, зато имеем явную декларацию поведения — откладывать или не откладывать. auto a = calc_once([]{ return some_func(); });
cout << a();
Ориентировался на википедию:
«Отложенные вычисления, ленивые вычисления или нестрогие вычисления — концепция в некоторых языках программирования, согласно которой вычисления следует откладывать до тех пор, пока не понадобится их результат.»
Код функтора выполнится при первом требовании, сохранит результат для последующих вызовов.
Если функтор не будет вызван — никакой работы не будет.
Если будет вызван несколько раз — работа произойдет один раз, при первом вызове.
Еще и музыка такая… Да я всего лишь робот, и делаю тупую физическую работу изо дня в день…
Но я профессионал! и мои пирожные всегда будут содержать правильное кол-во блинчиков. :)
Microsoft Google Apple
-----------------------------------------------------------
Windows ChromeOS MacOS
Windows Phone Nexus iPhone
Bing! Gooogle! ???
Все это, конечно, здорово, вы-то счастливы. А вот счастливы ли остальные 4-е технолога, что потеряли свое время на собеседования и работу у вас?
Если у вас свои особенные принципы прохождения испытательного срока («останется только один») — то лучше об этом заранее предупреждать.
Однако… Спасибо, что на наглядном примере объяснили, что такое «юношеский максимализм» и «звезданутость».
«Если это C++ вакансия – всю сиплюсплюсную лажу оставьте при себе».
«Все вопросы по COM – держите при себе. Вы устарели.»
Непонятно, почему бы не оставить возможность задавать эту таблицу в коде (текстом), строчка кода — строка таблицы. В качестве альтернативы. Текст — уж очень он универсален.
Вообще тут не просто рациональное зерно, а целое направление — изготовление полезных «магических» предметов. Т.е. в перспективе все больше видятся не прямоугольники с кнопками, а именно подобные «амулеты», обеспечивающие выполнение ф-ций через чиркание, махание, наведение, прикосновение, сжимание, скручивание и т.д.
Вторая посылка: обычно компиляторы не испытывают проблем с sizeof(int).
Вывод: result_type не является типом int.
«If the expression parameter is a call to a function...» — означает «Если вы в скобочках написали что-то, что похоже на вызов ф-ции...».
А вызов ф-ции/функтора обычно выглядит как применение оператора скобочки для объекта ф-ции/функтора (т.е. func()), а не чистое написание типа ф-ции/функтора (LambdaFunc).
Когда от него просят x[i], и в своем контейнере функторов для i у него ничего нет — он делает ленивый функтор и сохраняет его в контейнер. Функторы знают свой индекс и знают X, у которого могут запрашивать доступ к соседям.
И вся эта чехарда, чтобы написать что-то вроде:
for (unsigned i = 0; ( x[i + 1]() - x[i]() ) >= eps; ++i);
Стрелочка для того чтобы перенести определение возвращаемого значения ф-ции правее, в то место, где входной параметр ф-ции, объект func уже определен и может нам сказать, что он возвращает на операцию скобочки.
А decltype(LambdaFunc) — это идентично просто написать LambdaFunc, или даже просто не имеет значения.
Насколько я понял, std::future делает вычисления в параллельном потоке, и начинает сразу (т.е. нифига не ленится :)).
Ее стоит использовать, когда вам гарантировано понадобится результат, но вы хотите, пока он считается, заняться чем-нибудь другим.
С функтором немного сложнее, зато имеем явную декларацию поведения — откладывать или не откладывать.
auto a = calc_once([]{ return some_func(); });
cout << a();
«Отложенные вычисления, ленивые вычисления или нестрогие вычисления — концепция в некоторых языках программирования, согласно которой вычисления следует откладывать до тех пор, пока не понадобится их результат.»
Код функтора выполнится при первом требовании, сохранит результат для последующих вызовов.
Если функтор не будет вызван — никакой работы не будет.
Если будет вызван несколько раз — работа произойдет один раз, при первом вызове.
Разве не лениво? :)
В gcc 4.4 не хватает лямбд.
Студия от gcc 4.5 отстает в поддержке списков инициализации (но их тут нет).
И протереть можно, и нажатие есть.
Но я профессионал! и мои пирожные всегда будут содержать правильное кол-во блинчиков. :)
Они не оставляют никакого выбора :)
Если у вас свои особенные принципы прохождения испытательного срока («останется только один») — то лучше об этом заранее предупреждать.
«Если это C++ вакансия – всю сиплюсплюсную лажу оставьте при себе».
«Все вопросы по COM – держите при себе. Вы устарели.»
Налейте мне чаю и ничего не спрашивайте…