#include <vector>
#include <initializer_list>
#include <iostream>


template<typename Y, size_t N, typename T>
struct Flattener : public Flattener<Y, N-1, std::initializer_list<T>> {
	std::vector<Y> flatten(std::initializer_list<T> l) {
		std::vector<Y> vec;
		for (auto & e : l)
		{
			std::vector<Y> nvec = Flattener<Y, N, Y>{}.flatten(e);
			vec.insert(end(vec), begin(nvec), end(nvec));
		}
		return vec;
	};
	using Flattener<Y, N-1, std::initializer_list<T>>::flatten;
};

template<typename Y, typename T>
struct Flattener<Y, 0, T> {
	std::vector<Y> flatten(Y y) { return {{y}}; };
};

int main()
{
	auto v = Flattener<int, 10, int>{}.flatten({{{1,2}, {3,4,5}}});
	for (auto e : v) std::cout << e << std::endl;
}