#include <array>
#include <type_traits>
template<int ...N>
struct valuelist : std::integral_constant<int, sizeof...(N)> {} ;
//usage: generate_valuelist<5>::type gives valuelist<0,1,2,3,4>
template<int N>
class generate_valuelist
{
template<int I, int ...Is>
struct gen : gen<I-1, I-1, Is...> {};
template<int ...Is>
struct gen<0, Is...> { typedef valuelist<Is...> type; };
public:
typedef typename gen<N>::type type;
};
template<typename T, int...args>
auto repeat(T value, valuelist<args...>) -> std::array<T, sizeof...(args)>
{
//unpack args, repeating `value` sizeof...(args) times
//note that (X, value) evaluates to value
return {(args, value)...};
}
struct A{
A(int){}
};
template<typename T, size_t N>
std::array<T, N>
filled_array(T const& u)
{
//generate_valuelist<N>::type gives valuelist<0,1,...N-1>
typename generate_valuelist<N>::type pack;
std::array<T, N> items = repeat(u, pack);
return items;
}
int main() {
auto x = filled_array<A, 5>(A(1));
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZTxpbnQgLi4uTj4Kc3RydWN0IHZhbHVlbGlzdCA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCBzaXplb2YuLi4oTik+IHt9IDsKCi8vdXNhZ2U6IGdlbmVyYXRlX3ZhbHVlbGlzdDw1Pjo6dHlwZSBnaXZlcyB2YWx1ZWxpc3Q8MCwxLDIsMyw0Pgp0ZW1wbGF0ZTxpbnQgTj4KY2xhc3MgZ2VuZXJhdGVfdmFsdWVsaXN0CnsKICAgIHRlbXBsYXRlPGludCBJLCBpbnQgLi4uSXM+CiAgICBzdHJ1Y3QgZ2VuIDogZ2VuPEktMSwgSS0xLCBJcy4uLj4ge307CgogICAgdGVtcGxhdGU8aW50IC4uLklzPgogICAgc3RydWN0IGdlbjwwLCBJcy4uLj4geyB0eXBlZGVmIHZhbHVlbGlzdDxJcy4uLj4gdHlwZTsgfTsKIHB1YmxpYzoKICAgIHR5cGVkZWYgdHlwZW5hbWUgZ2VuPE4+Ojp0eXBlIHR5cGU7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQuLi5hcmdzPgphdXRvIHJlcGVhdChUIHZhbHVlLCB2YWx1ZWxpc3Q8YXJncy4uLj4pIC0+IHN0ZDo6YXJyYXk8VCwgc2l6ZW9mLi4uKGFyZ3MpPiAKewogICAvL3VucGFjayBhcmdzLCByZXBlYXRpbmcgYHZhbHVlYCBzaXplb2YuLi4oYXJncykgdGltZXMKICAgLy9ub3RlIHRoYXQgKFgsIHZhbHVlKSBldmFsdWF0ZXMgdG8gdmFsdWUKICAgcmV0dXJuIHsoYXJncywgdmFsdWUpLi4ufTsgCn0KCnN0cnVjdCBBewogIEEoaW50KXt9ICAKfTsKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgTj4Kc3RkOjphcnJheTxULCBOPgpmaWxsZWRfYXJyYXkoVCBjb25zdCYgdSkKewogICAgLy9nZW5lcmF0ZV92YWx1ZWxpc3Q8Tj46OnR5cGUgZ2l2ZXMgdmFsdWVsaXN0PDAsMSwuLi5OLTE+CiAgICB0eXBlbmFtZSBnZW5lcmF0ZV92YWx1ZWxpc3Q8Tj46OnR5cGUgcGFjazsKICAgIHN0ZDo6YXJyYXk8VCwgTj4gaXRlbXMgPSByZXBlYXQodSwgcGFjayk7CiAgICByZXR1cm4gaXRlbXM7Cn0KCmludCBtYWluKCkgewogICAgYXV0byB4ID0gZmlsbGVkX2FycmF5PEEsIDU+KEEoMSkpOwp9