#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;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCgp0ZW1wbGF0ZTx0eXBlbmFtZSBZLCBzaXplX3QgTiwgdHlwZW5hbWUgVD4Kc3RydWN0IEZsYXR0ZW5lciA6IHB1YmxpYyBGbGF0dGVuZXI8WSwgTi0xLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4+IHsKCXN0ZDo6dmVjdG9yPFk+IGZsYXR0ZW4oc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGwpIHsKCQlzdGQ6OnZlY3RvcjxZPiB2ZWM7CgkJZm9yIChhdXRvICYgZSA6IGwpCgkJewoJCQlzdGQ6OnZlY3RvcjxZPiBudmVjID0gRmxhdHRlbmVyPFksIE4sIFk+e30uZmxhdHRlbihlKTsKCQkJdmVjLmluc2VydChlbmQodmVjKSwgYmVnaW4obnZlYyksIGVuZChudmVjKSk7CgkJfQoJCXJldHVybiB2ZWM7Cgl9OwoJdXNpbmcgRmxhdHRlbmVyPFksIE4tMSwgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+Pjo6ZmxhdHRlbjsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFksIHR5cGVuYW1lIFQ+CnN0cnVjdCBGbGF0dGVuZXI8WSwgMCwgVD4gewoJc3RkOjp2ZWN0b3I8WT4gZmxhdHRlbihZIHkpIHsgcmV0dXJuIHt7eX19OyB9Owp9OwoKaW50IG1haW4oKQp7CglhdXRvIHYgPSBGbGF0dGVuZXI8aW50LCAxMCwgaW50Pnt9LmZsYXR0ZW4oe3t7MSwyfSwgezMsNCw1fX19KTsKCWZvciAoYXV0byBlIDogdikgc3RkOjpjb3V0IDw8IGUgPDwgc3RkOjplbmRsOwp9