Diciamo ho un tipo che non è né mobile né copiabile:Come inizializzare una sequenza di oggetti non mobili e non copiabili?
struct foo
{
explicit foo(size_t){}
~foo(){}
foo(foo const &) = delete;
foo(foo &&) = delete;
foo& operator=(foo const &) = delete;
foo& operator=(foo &) = delete;
};
Ora dato un numero noto al momento della compilazione (chiamare N), c'è un modo che possa creare una "sequenza" di questi in pila con ognuno inizializzato con i numeri da 0 a N-1? Sarei soddisfatto con un array in stile C foo[N]
, uno std::array< foo, N >
o forse anche un std::tuple
di qualche tipo.
Quello che sto cercando di evitare sta scrivendo out:
foo f0(0), f1(1), ... fNminus1(N-1);
quando ci si sente come questo è qualcosa che il compilatore dovrebbe essere in grado di fare per me. Il meglio che sono riuscito a fare è usare boost::optional
.
Ma questo si basa sulla logica di runtime anche se tutte le informazioni richieste sono disponibili in fase di compilazione. Inoltre, mi rimane qualcosa che si comporta come una serie di indicatori.
Ho paura di dover votare. Il problema qui è che se 'construct' genera un'eccezione, chiamerai il distruttore di un oggetto che non è mai stato costruito. –
@DavidStone Sì, questo è un problema. Il costruttore non dovrebbe buttare. Ho aggiunto un 'static_assert'. Nella risposta di Benjamin Lindley, quando il costruttore fallisce, non viene chiamato nessun distruttore. – R1tschY
modificato a upvote –