#include <iostream>
#include <vector>
#include <functional>

template<class InputIterator, class Function>
Function my_for_each(InputIterator first, InputIterator last, Function fn)
{
	while (first != last) {
		fn(*first);
		++first;
	}
	return fn;  
}

struct FunctorNMC //non-move-constructible
{
	FunctorNMC() = default;
	FunctorNMC(FunctorNMC&&) = delete;

	void operator()(int a) const { std::cout << a << " ";	}
};

void print(int a) { std::cout << a << " "; }

int main()
{
	std::vector<int> v{1,2,3};

	auto lambda = [](int a){ std::cout << a << " "; };
	std::function<void(int)> func = lambda;

	//my_for_each(v.begin(), v.end(), FunctorNMC());
	std::cout << "\n";

	FunctorNMC tmp;
	my_for_each(v.begin(), v.end(), tmp);

	std::cout << "\n";
	my_for_each(v.begin(), v.end(), lambda);
	std::cout << "\n";
	my_for_each(v.begin(), v.end(), func);
	std::cout << "\n";
	my_for_each(v.begin(), v.end(), print);
	std::cout << "\n";
}