Ich habe eine (Drittanbieter-) Klasse, die nicht kopierbar ist. Ich möchte eine Reihe von ihnen initialisieren. Hier ist mein bester Versuch:C++ 11 Array-Initialisierung mit einem nicht kopierbaren Typ mit expliziten Konstruktor
#include <array>
class Thing
{
public:
explicit Thing(int) {}
Thing(const Thing&) = delete;
};
int main()
{
std::array<Thing, 1> things{{{100}}}; // error here
};
GCC 4.7.2 sagt:
error: converting to ‘std::array::value_type {aka Thing}’ from initializer list would use explicit constructor ‘Thing::Thing(int)’
OK, aber das ist genau das, was ich will - den expliziten Konstruktor verwenden. Wie kann ich das ausdrücken? Wenn ich den Konstruktor tatsächlich selbst aufruft, erhalte ich eine Fehlermeldung über den Kopierkonstruktor, der gelöscht wird. Und ich kann std::move()
nicht verwenden, weil Thing nicht beweglich ist (und ich kann es nicht ändern).
Die einzige Alternative, die ich bis jetzt gefunden habe, ist https://stackoverflow.com/a/15962814/4323, aber das ist unerwünscht, weil es eine Menge zusätzlichen Code plus ich muss den "Speicher" überall wo ich es verwende (oder einen separaten Zeiger darauf halten, was fügt hinzu Indirektion will ich nicht).
Ich möchte eine Lösung, die maximale Leistung gibt, wenn Sie die Dinge ohne eine Menge hässlichen Standard verwenden.
Sie könnten einen expliziten Konstruktor hinzufügen, der 'initializer_list' übernimmt? –
Der Standard besagt, dass für 'std :: array', 'T' muss MoveConstructible und MoveAssignable sein –
Die Lösung im verknüpften Thread sieht nicht zu schmerzhaft. Du musst sowieso eine Umleitungsebene haben (ich denke nicht, dass der Zugriff auf 'sachen [n]' für 'std :: array' anders ist als der Zugriff auf' sachen [n] 'wo' Dinge * sachen; 'in die Speicher, den Sie Placement neu in) –