Skip to content

Latest commit

 

History

History
62 lines (53 loc) · 12.6 KB

Lecture 06.md

File metadata and controls

62 lines (53 loc) · 12.6 KB


Std::function

Type erasure - скрытие объектов разного типа за одним общим

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 - хранит любой тип внутри себя

Variadic templates

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() {}