Здравствуйте, T4r4sB, Вы писали:
TB>Здравствуйте, ollv, Вы писали:
O>> так typedef TYPE_OF_3_PARAMETER(func(int(), int(), int(), int())) third_parameter_type; ?\
TB>Ну например, только троечка должна быть параметром, а не частью имени, конечно же.
Отлично. Напиши, как ты это видишь?
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, ollv, Вы писали:
O>Здравствуйте, T4r4sB, Вы писали:
TB>>Здравствуйте, ollv, Вы писали:
O>>> так typedef TYPE_OF_3_PARAMETER(func(int(), int(), int(), int())) third_parameter_type; ?\
TB>>Ну например, только троечка должна быть параметром, а не частью имени, конечно же. O>Отлично. Напиши, как ты это видишь?
Здравствуйте, rg45, Вы писали: R>А что препятствует переходу на что-то более свеженькое?
Да, коней на переправе не меняют. С новым проектом будет и новая студия. Не хочется тратить время на адаптацию перед релизом.
Здравствуйте, T4r4sB, Вы писали:
TB>Здравствуйте, ollv, Вы писали:
O>>Здравствуйте, T4r4sB, Вы писали:
TB>>>Здравствуйте, ollv, Вы писали:
O>>>> так typedef TYPE_OF_3_PARAMETER(func(int(), int(), int(), int())) third_parameter_type; ?\
TB>>>Ну например, только троечка должна быть параметром, а не частью имени, конечно же. O>>Отлично. Напиши, как ты это видишь? TB>
Здравствуйте, ollv, Вы писали:
O>погоди, так это плюсовой вариант и есть. Просто за макросом кое что будет написано.
Кое-что из 100 строк копипасты.
То есть если мне понадобится чуть иной вариант, то я должен писать свою копипасту.
Ну и без библиотек, хранящих тонны платформозависимых костылей на каждую платформу, на С++ по сути уже писать нельзя.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
TB>Здравствуйте, ollv, Вы писали:
O>>погоди, так это плюсовой вариант и есть. Просто за макросом кое что будет написано.
TB>Кое-что из 100 строк копипасты.
Так необязательно смотреть этот код. А кейсы и их количество, ну извини пока экспоненциального роста кейсов не наблюдается никаких проблем я не вижу. Более того половина кода такого — генерится. TB>То есть если мне понадобится чуть иной вариант, то я должен писать свою копипасту.
В нормальной библиотеке оч тяжело найти кейс который не покрыт. Если это самописная — можно подойти к тому кто саппортит этот код. TB>Ну и без библиотек, хранящих тонны платформозависимых костылей на каждую платформу, на С++ по сути уже писать нельзя.
)) ха — смешно. А на чем можно ?
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, Went, Вы писали:
W>Запустить "как есть" его не получится (call_traits и call_elements), но, может, будут какие-то замечания просто при взгляде на него?
Здравствуйте, Went, Вы писали:
W>Здравствуйте. Короче, получилось что-то такое:
W>Запустить "как есть" его не получится (call_traits и call_elements), но, может, будут какие-то замечания просто при взгляде на него?
вроде бы [fn, args...]() { fn_(std::move(args)...); }
должно сработать.
Здравствуйте, rg45, Вы писали:
NB>>вроде бы [fn, args...]() { fn_(std::move(args)...); } NB>>должно сработать.
R>В результате move можно получить нежелательное преобразование к rvalue и нарваться на несовместимость фактических и формальных параметров.
в какой ситуации? если параметр не const ссылка? тогда и захват значения смысла иметь не будет.
Здравствуйте, Went, Вы писали:
W>Запустить "как есть" его не получится (call_traits и call_elements), но, может, будут какие-то замечания просто при взгляде на него?
Виталик, а можешь объяснить, чем не устраивает "лобовой" вариант? Повторный вызов defer_proxy ведь у тебя все равно невозможен (UB), так какой смысл отделять функтор от параметров?
Здравствуйте, Went, Вы писали:
W>Запустить "как есть" его не получится (call_traits и call_elements), но, может, будут какие-то замечания просто при взгляде на него?
Вот тебе еще один вариант. В точности в твоей постановке, но гораздо проще в реализации, без туплов и всяких мета-чудес:
R>А то выходит, что ты сначала делаешь move и тут же копирование.
Увы, в С++11 присвоение внутри списков захвата не завезли...
R>И второе, несколько смущает такая одноразовость объектов defer_proxy. Повторное использование чревато UB. Я бы подумал, как можно обезопасить код.
Да, с одноразовостью я погорячился, ее там быть не должно. Придется делать обычное копирование, еще и 2 раза.
Здравствуйте, night beast, Вы писали: NB>вроде бы [fn, args...]() { fn_(std::move(args)...); } NB>должно сработать.
Проверю, но не уверен, что в С++11 есть захват паков параметров...
Здравствуйте, rg45, Вы писали: R>Виталик, а можешь объяснить, чем не устраивает "лобовой" вариант? Повторный вызов defer_proxy ведь у тебя все равно невозможен (UB), так какой смысл отделять функтор от параметров? R>http://coliru.stacked-crooked.com/a/be68f70b50a6c00b
Во-первых, я погорячился, и повторный вызов должен работать корректно
Во-вторых, вызов функции defer не должен добавлять вызов в список сразу, а должен создавать функцию эквивалентной сигнатуры, вызов которой уже "сбиндит" прокси-функцию и положит ее в очередь обработки.
Вот небольшой пример использования (функции и классы из головы):
// Какая-то демо-функцияvoid log(std::string text)
{
log() << text;
}
Socket<void(std::string)> n_input;
int main()
{
// Это код вызовет запись в лог немедленно
n_input.connect(&log);
n_input("Instant notification"); // То есть после этой строчки в логе уже надпись "Instant notification"
n_input.disconnect_all();
// А этот код покладет запись в лог в очередь, которая обработается "когда-то потом"
n_input.connect(defer(&log));
n_input("Defered notification"); // То есть после этой строчки в логе сразу ничего не появится
process_queue(); // А после этой строчки - в логе появится "Defered notification"
}