Pull to refresh
120
0
Сергій Олендаренко @GooRoo

User

Send message
Motorola в США выпустила клёвый клавиатурник Photon Q, который завязан на Sprint :'(
Очень навряд ли :) В его версии это звучало примерно так: «По закону Либерти разработка программы занимает всегда больше изначально предполагаемого времени, даже если сделать поправку на закон Либерти».

В любом случае, с таким-то названием книги это звучит достаточно иронично.
Это Закон Джесса Либерти — автора книги «Освой самостоятельно C++ за 21 день» :)
Всё это мне напоминает времена, когда люди ругались на новый вид Главного меню и голубые окошки в винде, начиная с Windows XP, потом на Aero в Windows Vista, потом на новый таскбар в Windows 7, а сейчас на Metro в грядущей Windows 8. Тоже были туевы хучи статей негодования и т.п. (и не удивительно, ведь, как известно, людям присущ консерватизм — кому-то больше, кому-то меньше).

А мне все эти изменения по душе.
Абсолютно не главное :)
В том, что доступ к VK на работе заблокирован :/
Картинки на серверах VK — это, конечно, не очень хорошо. Поменяйте хотя бы *.vkontakte.ru на *.userapi.com, если не затруднит.
По ссылке не работают конечно. И это хорошо.
Однозначного ответа я Вам не дам, но не исключаю вариант, что компилятор оптимизирует подобные места за счёт Copy Elision хотя бы.
Сделайте лямбду [=] вместо [&] и всё будет работать.
Самое время заиметь.
#include <cstddef>
#include <functional>
#include <iostream>

using namespace std;

typedef function<double(double)> realfunc;

realfunc go(realfunc A, realfunc B)
{
	return [=](double x) {
		return A(x) * 5 + B(x);
	};
}

int main()
{
	realfunc A = [](double x) {
		return x;
	};
	realfunc B = [](double x) {
		return x;
	};
	auto A5pB = go(A, B);
	cout << A5pB(3) << endl;

	return EXIT_SUCCESS;
}

В целом да, должно работать.
Оу, у Вас и так list<>. Это я провтычил, но ничего от этого не меняется.
Я конечно польщён, что моя статья про лямбды натолкнула Вас на такую идею, однако, интуиция мне подсказывает, что можно было всё это сделать проще.

Я правильно понял, что Вы создаёте статическое хранилище функций, которое заполняете в рантайме? о_О Причём, коллекция только заполняется — из неё ничего не удаляется.

Значит, если я создам в своей программе 500 функций, то там будет как минимум 500 объектов (на самом деле больше, т.к. при композиции создаются дополнительные объекты func_t), причём удалятся они только при завершении работы программы.

Как минимум, неплохо бы заменить std::vector<> на std::list<>, а в класс добавить счётчик ссылок, чтобы ненужные функции оттуда удалялись, когда они становятся ненужными.

А вообще, не могли бы Вы ещё раз объяснить (желательно на примере кода) вот этот абзац, ибо мне кажется, я чего-то не уловил:
Скажем, мы хотим, чтобы некая процедура принимала пару функций A и B и возвращала новое выражение, например, 5A + B. Наша процедура создаст лямбду 5A, затем создаст 5A + B, используя 5А и В. Полученное процедура вернет и завершится, в этот момент лямбда 5А пропадет из области видимости и возвращенное выражение попросту не будет работать.
В студии лямбда вернула ноль. А вообще всё забываю по этому поводу почитать стандарт.
Про move-конструкторы я думал, и это, пожалуй, приоритет номер один на данный момент. Но описание способа передачи данных — это спорно очень, ибо сильно снижает читабельность. Хотя может можно как-то извратиться приемлемо. В любом случае, я не предлагаю использовать то, что я написал, в требовательных к ресурсам системах. Я вообще не предлагаю это использовать :)
Думаю, это особенность реализации. Вряд ли так написано в стандарте.

Information

Rating
Does not participate
Location
Харьков, Харьковская обл., Украина
Date of birth
Registered
Activity