LINUX.ORG.RU

История изменений

Исправление 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";
}