Lassen Sie uns sagen, dass ich eine Art haben, die weder beweglich noch kopierbar ist:Wie initialisiert man eine Sequenz von nicht beweglichen, nicht kopierbaren Objekten?
struct foo
{
explicit foo(size_t){}
~foo(){}
foo(foo const &) = delete;
foo(foo &&) = delete;
foo& operator=(foo const &) = delete;
foo& operator=(foo &) = delete;
};
nun eine Zahl zum Zeitpunkt der Kompilierung bekannt gegeben (nennen wir es N), ist es eine Möglichkeit, dass ich eine „Sequenz“ von diesen erstellen auf dem Stapel mit jeder mit den Zahlen 0 bis N-1 initialisiert? Ich würde mit einem C-artigen Array foo[N]
, einem std::array< foo, N >
oder vielleicht sogar einem std::tuple
irgendeiner Art zufrieden sein.
Was ich versuche zu vermeiden, das Schreiben aus:
foo f0(0), f1(1), ... fNminus1(N-1);
wenn es so fühlt sich etwas ist der Compiler sollte für mich tun können. Das Beste, was ich mir vorstellen konnte, ist boost::optional
.
Aber das beruht auf Laufzeitlogik, obwohl alle erforderlichen Informationen zur Kompilierzeit verfügbar sind. Außerdem habe ich etwas, das sich wie eine Reihe von Zeigern verhält.
Ich fürchte, ich muss dies abstimmen. Das Problem hierbei ist, dass, wenn 'construct' eine Ausnahme auslöst, Sie den Destruktor eines Objekts aufrufen werden, das nie konstruiert wurde. –
@DavidStone Ja, das ist ein Problem. Der Konstruktor sollte nicht werfen. Ich habe eine 'static_assert' hinzugefügt. In der Antwort von Benjamin Lindley, wenn der Konstruktor fehlschlägt, wird kein Destruktor aufgerufen. – R1tschY
Geändert zu einem upvote –