История изменений
Исправление MOPKOBKA, (текущая версия) :
#include <iostream>
template <typename X, typename Gr, typename Fr>
struct compose {
using G = Gr(*)(X);
using F = Fr(*)(Gr);
G g; F f;
compose(G g, F f) : g{g}, f{f} {}
Fr operator()(X x) { return f(g(x)); }
};
int add10(int x) { return 10; }
float mul125(int x) { return x * 1.25; }
int main() {
auto f = compose{add10, mul125};
std::cout << f(5) << "\n";
}
Так можно избавится от лишних проблем с памятью, композиции композиции не будет, но нужность хотя бы одной композиции еще нужно выяснить. Еще композиция композиции это хранение композиции, это все может очень быстро привести к гигантской композиции, что точно эффективным не будет. Так что это как я уже выше написал, исходит из близости к реальности.
Это полезно лишь в динамической программе, но этот конкретный подход не очень, в C/С++ хватает библиотек и приложений которые сначала строят план выполнения, а потом очень быстро и хорошо по нему делают какую то работу.
Если все статическое, то не проще ли написать обычную функцию? В Forth это выйдет даже короче чем композиции из хескелов и лиспов.
: z g f ;
5 z
Исправление MOPKOBKA, :
#include <iostream>
template <typename X, typename Gr, typename Fr>
struct compose {
using G = Gr(*)(X);
using F = Fr(*)(Gr);
G g; F f;
compose(G g, F f) : g{g}, f{f} {}
Fr operator()(X x) { return f(g(x)); }
};
int add10(int x) { return 10; }
float mul125(int x) { return x * 1.25; }
int main() {
auto f = compose{add10, mul125};
std::cout << f(5) << "\n";
}
Так можно избавится от лишних проблем с памятью, композиции композиции не будет, но нужность хотя бы одной композиции еще нужно выяснить. Еще композиция композиции это хранение композиции, это все может очень быстро привести к гигантской композиции, что точно эффективным не будет. Так что это как я уже выше написал, исходит из близости к реальности.
Исправление MOPKOBKA, :
#include <iostream>
template <typename X, typename Gr, typename Fr>
struct compose {
using G = Gr(*)(X);
using F = Fr(*)(Gr);
G g; F f;
compose(G g, F f) : g{g}, f{f} {}
Fr operator()(X x) { return f(g(x)); }
};
int add10(int x) { return 10; }
float mul125(int x) { return x * 1.25; }
int main() {
auto f = compose{add10, mul125};
std::cout << f(5) << "\n";
}
Так можно избавится от лишних проблем с памятью, композиции композиции не будет, но нужность хотя бы одной композиции еще нужно выяснить. Еще композиция композиции это хранение композиции, это все может очень быстро привести к гигантской композиции, что точно эффективным не будет.
Исправление MOPKOBKA, :
#include <iostream>
template <typename X, typename Gr, typename Fr>
struct compose {
using G = Gr(*)(X);
using F = Fr(*)(Gr);
G g; F f;
compose(G g, F f) : g{g}, f{f} {}
Fr operator()(X x) { return f(g(x)); }
};
int add10(int x) { return 10; }
float mul125(int x) { return x * 1.25; }
int main() {
auto f = compose{add10, mul125};
std::cout << f(5) << "\n";
}
Так можно избавится от лишних проблем с памятью, композиции композиции не будет, но нужность хотя бы одной композиции еще нужно выяснить. Еще композиция композиции это хранение композиции, это все может очень быстро привести к гигантской композиции.
Исправление MOPKOBKA, :
#include <iostream>
template <typename X, typename Gr, typename Fr>
struct compose {
using G = Gr(*)(X);
using F = Fr(*)(Gr);
G g; F f;
compose(G g, F f) : g{g}, f{f} {}
Fr operator()(X x) { return f(g(x)); }
};
int add10(int x) { return 10; }
float mul125(int x) { return x * 1.25; }
int main() {
auto f = compose{add10, mul125};
std::cout << f(5) << "\n";
}
Так можно избавится от лишних проблем с памятью, композиции композиции не будет, но нужность хотя бы одной композиции еще нужно выяснить.
Исходная версия MOPKOBKA, :
#include <iostream>
template <typename X, typename Gr, typename Fr>
struct compose {
using G = Gr(*)(X);
using F = Fr(*)(Gr);
G g; F f;
compose(G g, F f) : g{g}, f{f} {}
Fr operator()(X x) { return f(g(x)); }
};
int add10(int x) { return 10; }
float mul125(int x) { return x * 1.25; }
int main() {
auto f = compose{add10, mul125};
std::cout << f(5) << "\n";
}