12

Suppose type foo_t with a named constructor idiom, make_foo(). Now, I want to have exactly 123 foo's - no more, no less. So, I'm thinking about an std::array<foo_t, 123>. Now, if foo_t were default-constructible, I would write:

std::array<foo_t, 123> pity_the_foos;
std::generate(
    std::begin(pity_the_foos), std::end(pity_the_foos),
    []() { return make_foo(); }
);

and Bob's my uncle, right? Unfortunately... foo_t has no default ctor.

How should I initialize my array, then? Do I need to use some variadic template expansion voodoo perhaps?

Note: Answers may use anything in C++11, C++14 or C++17 if that helps at all.

einpoklum
  • 118,144
  • 57
  • 340
  • 684
  • will this help? https://stackoverflow.com/a/19016627/8414561 – Dev Null Oct 23 '17 at 23:04
  • @DevNull: Yes, but - how idiomatic is that array generator snippet you have there? – einpoklum Oct 23 '17 at 23:05
  • define "idiomatic"? :) – Dev Null Oct 23 '17 at 23:06
  • @DevNull: There's a tag for that... the idiom that the most people use; the "common, appropriate thing to do". Also - that looks like it needs some fixup to use C++14 integer sequences, am I right? – einpoklum Oct 23 '17 at 23:07
  • well, the answer shows that it seems to be pretty idiomatic – Dev Null Oct 23 '17 at 23:09
  • Very similar (except generator versus repeat-copy): [c++ - How to initialize std::array elegantly if T is not default constructible? - Stack Overflow](https://stackoverflow.com/questions/18497122/how-to-initialize-stdarrayt-n-elegantly-if-t-is-not-default-constructible) – user202729 Feb 12 '22 at 11:13

1 Answers1

17

The usual.

template<size_t...Is>
std::array<foo_t, sizeof...(Is)> make_foos(std::index_sequence<Is...>) {
    return { ((void)Is, make_foo())... };
}

template<size_t N>
std::array<foo_t, N> make_foos() {
    return make_foos(std::make_index_sequence<N>());
}
T.C.
  • 133,968
  • 17
  • 288
  • 421
  • That index sequence does keep popping up, doesn't it... although, really, I shouldn't even need the integer sequence in my case, just any tuple of length N. – einpoklum Oct 23 '17 at 23:10