Mam klasę (innej firmy), która nie jest dostępna do kopiowania. Chciałbym zainicjować ich szereg. Oto moja najlepsza próba:Inicjalizacja tablic C++ 11 z typem nie do kopiowania z jawnym konstruktorem
#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 mówi:
error: converting to ‘std::array::value_type {aka Thing}’ from initializer list would use explicit constructor ‘Thing::Thing(int)’
OK, ale to jest dokładnie to, co chcę - aby użyć wyraźne konstruktora. Jak mogę to wyrazić? Jeśli sam wywołuję konstruktora, pojawia się błąd dotyczący usunięcia konstruktora kopiowania. I nie mogę używać std::move()
, ponieważ Thing nie jest ruchomy (i nie mogę go modyfikować).
Jedyną alternatywą, którą znalazłem do tej pory, jest https://stackoverflow.com/a/15962814/4323, ale jest to niepożądane, ponieważ jest to pęczek dodatkowego kodu i muszę przesyłać "pamięć" wszędzie, gdzie go używam (lub zachować oddzielny wskaźnik do niego, który dodaje w kierunku, którego nie chcę).
Chcę rozwiązania, które zapewnia maksymalną wydajność podczas korzystania z Rzeczy bez wielu brzydkich elementów.
Można dodać jawny konstruktor, który pobiera 'initializer_list'? –
Standard mówi, że dla 'std :: array', 'T' musi być MoveConstructible i MoveAssignable –
Rozwiązanie w połączonym wątku nie wygląda zbyt boleśnie. Musisz i tak mieć poziom niezależności (nie sądzę, że dostęp do 'rzeczy [n]' dla 'std :: array' jest inny niż dostęp do' rzeczy [n] 'gdzie' Things * things; 'wskazuje na miejsce, w którym wstawiłeś nowe) –