- 1
- 2
- 3
- 4
template <class F, class G>
auto operator*(F&& f, G&& g) -> decltype(auto) {
return [=](auto ...args) { return f(g(args...)); };
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
template <class F, class G>
auto operator*(F&& f, G&& g) -> decltype(auto) {
return [=](auto ...args) { return f(g(args...)); };
}
Композиция функций
Итить, ита у них шо, даже валюта своя есть?
https://ideone.com/cSGHW3
auto f= [](auto x) -> int;
auto g =[](auto y) -> int;
(f*g)(4)
Чистый функциональный кодинг. Прям Haskell
Хули на идеоне не роботает?
https://ideone.com/Ffcjmq
https://en.wikipedia.org/wiki/Buffer_overflow_protection
https://ideone.com/Nv1RTy
https://ideone.com/NBk0Re
Надо компилировать с директивой {$modeswitch nestedprocvars}, тогда всё будет работать, в отличие от сишки:
https://ideone.com/ZMFpW7
Да, у указателя на функцию должен быть модификатор "is nested".
Пытался задурить его с помощью class operator и дженериков, но что-то пока не получилось.
В общем, нельзя просто взять и вытащить наружу вложенную функцию. Нужно мастерить для неё окружение.
Искать решение задачи нужно в одном из двух направлений:
1. Городить огород из асмовставок и всего такого.
2. Оборачивать всё в классы и решать через ООП.
В текущей версии fpc сделать проще вряд ли получится.
https://ideone.com/gJG1aD
Или так:
https://ideone.com/YPq4FL
Можно, конечно, но так только в g все аргументы передадутся, а f в пролёте.
В отличие от хаскеля или даже C++, где компилятор типы проверяет, пользоваться этим говном можно только в примитивных случаях.
А теперь представим, что g возвращает список, и f принимает один аргумент — список.
Ты всё сломал.