struct function { template <typename F> //F имеет operator() и copyrable/moveable function(F const& f) : ptr(std::make_unique<model<F>>(std::move(f)) {} function(function const& other) : ptr(other.ptr -> copy()) {} bool operator()(int a, int b) const { return ptr -> call(); } private: std::unique_ptr<concept> ptr; };
struct function::concept { virtual ~concept(); virtual unique_ptr<concept> copy() const; virtual bool call(int a, int b); };
template <typename F> struct function::model : concept { model(F f) : f(std::move(f)){} unique_ptr<concept> copy() { return make_unique<model<F>>(f) } bool call(int a, int b) { return f(a, b); }
F f<span class="token punctuation">;</span>
};
Примеры использования таких функций
any_iterator<int> = v.begin();
any_range<int>
any - хранит любой тип внутри себя
template <typename T, typename ... A> unique_ptr<T> make unique(A && ...a) { return unique_ptr<T>(new T(forward<A>(a)...); }
f(g(a...)) -> f(g(a0, a1, a2, a3...)) f(g(a)...) -> f(g(a0), g(a1), g(a2) ...)
sizeof...
- указать количество элементов variadic templates
Ну чо, write из паскаля template<typename A0, typename ... As> void write(A0 const& a0, As const& as) { std::cout << a0; write(as ...); }
void write() {}