#include <iostream>
#include <initializer_list>
#include <array>
#include <tuple>
template<typename T, std::size_t N>
struct ArrayInitializer {
template<typename U> struct id { using type = U; };
std::array<T, N> t;
template<typename U = std::initializer_list<T>>
ArrayInitializer(typename id<U>::type z)
:ArrayInitializer(z, std::make_index_sequence<N>())
{
if(N > z.size())
throw std::out_of_range("that's crazy!");
}
template<typename ...U>
ArrayInitializer(U &&... u)
:t{ std::forward<U>(u)... }
{ }
private:
template<std::size_t ...Ns>
ArrayInitializer(std::initializer_list<T>& t,
std::index_sequence<Ns...>)
:t{ *(t.begin() + Ns) ... }
{ }
};
template<typename T, std::size_t N>
std::array<T, N> f(ArrayInitializer<T, N> ai) {
return std::move(ai.t);
}
int main() {
f<int, 5>({1, 2, 3, 4, 5}); // OK
//f<int, 5>({1, 2, 3, 4, 5, 6}); // error - "too many initializers for array<int, 5>"
std::initializer_list<int> il{1, 2, 3, 4, 5};
f<int, 5>(il); // ok
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KI2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8dHVwbGU+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOPgpzdHJ1Y3QgQXJyYXlJbml0aWFsaXplciB7CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBzdHJ1Y3QgaWQgeyB1c2luZyB0eXBlID0gVTsgfTsKICAgIHN0ZDo6YXJyYXk8VCwgTj4gdDsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVID0gc3RkOjppbml0aWFsaXplcl9saXN0PFQ+PgogICAgQXJyYXlJbml0aWFsaXplcih0eXBlbmFtZSBpZDxVPjo6dHlwZSB6KSAKICAgICAgICA6QXJyYXlJbml0aWFsaXplcih6LCBzdGQ6Om1ha2VfaW5kZXhfc2VxdWVuY2U8Tj4oKSkKICAgIHsgCiAgICAgICAgaWYoTiA+IHouc2l6ZSgpKQogICAgICAgICAgICB0aHJvdyBzdGQ6Om91dF9vZl9yYW5nZSgidGhhdCdzIGNyYXp5ISIpOwogICAgfQoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLlU+CiAgICBBcnJheUluaXRpYWxpemVyKFUgJiYuLi4gdSkKICAgICAgIDp0eyBzdGQ6OmZvcndhcmQ8VT4odSkuLi4gfQogICAgeyB9Cgpwcml2YXRlOgogICAgdGVtcGxhdGU8c3RkOjpzaXplX3QgLi4uTnM+CiAgICBBcnJheUluaXRpYWxpemVyKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiYgdCwKICAgICAgICAgICAgICAgICAgICAgc3RkOjppbmRleF9zZXF1ZW5jZTxOcy4uLj4pCiAgICAgICA6dHsgKih0LmJlZ2luKCkgKyBOcykgLi4uIH0KICAgIHsgfQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTj4Kc3RkOjphcnJheTxULCBOPiBmKEFycmF5SW5pdGlhbGl6ZXI8VCwgTj4gYWkpIHsKICAgIHJldHVybiBzdGQ6Om1vdmUoYWkudCk7Cn0KCmludCBtYWluKCkgewogICBmPGludCwgNT4oezEsIDIsIDMsIDQsIDV9KTsgIC8vIE9LIAogICAvL2Y8aW50LCA1Pih7MSwgMiwgMywgNCwgNSwgNn0pOyAgLy8gZXJyb3IgLSAidG9vIG1hbnkgaW5pdGlhbGl6ZXJzIGZvciBhcnJheTxpbnQsIDU+IgoKICAgc3RkOjppbml0aWFsaXplcl9saXN0PGludD4gaWx7MSwgMiwgMywgNCwgNX07CiAgIGY8aW50LCA1PihpbCk7IC8vIG9rCn0=