2016-07-29 16 views
7

Sabit olmayan, T sınıfı olmayan ve varsayılan olarak yapılamaz olan bir nesne var. Boyut sabit olduğu için unique_ptr veya vector yerine std::array gibi bir dizi-ish kapsayıcı kullanmak istiyorum. Eğer yardımcı olabilsem, dolaylı ek katmandan kaçınmak istiyorum.Bir std :: dizisi <T, 2> nasıl başlatılır, burada T, kopyalanamaz ve varsayılan olarak yapılandırılamaz mı?

std::array<T, 2>'u nasıl ilklendirebilirim? array<T, 2> {T(...), T(...)}'u kullanarak, silinmiş kopya oluşturucusuyla ilgili bir hatayla sonuçlanır. array<T, 2> {move(T(...)), move(T(...))} kullanmak, dizi öğelerini hareket ettiriciyi kullanmaya zorlamaz. std::array<T, 2> doğal olarak işe yaramıyorsa, yerleştirme-yeni gibi ek bir dolaylı ya da manuel bellek yönetimi tekniklerine başvurmadan başka neler yapabilirim?

+0

geldi bana. 'std :: array' T/etc için benzersiz/paylaşımlı ptr'leri ... –

+0

@SamVarshavchik, Yine de std :: vector' işlevini, yalnızca varsayılan, yapılandırılmamış türlerde kullanabilirsiniz. – chris

+0

Neyi başarmak istediğim, prensip olarak, yeni yerleştirme gibi karmaşık ve zor okunan tekniklerle de olsa, başarılabilir. Bir vektörün basit olacağını biliyorum ama bana prensipten kaçınmaktan kaçınmak için yola koyduğum ek yükü bana veriyor. – Syncopated

cevap

0

Benim örnek iyi değil ama .. Sadece make_array bir işlev oluşturmak ve

http://ideone.com/fxAO3t

#include <array> 
#include <iostream> 

class Foo 
{ 
    public: 
     Foo(int) 
     { 

     } 

     Foo(const Foo &) = delete; 

     Foo(Foo &&) 
     { 
      std::cout<<"Moved\n"; 
     } 
}; 

template<class... Type> 
constexpr std::array<typename std::common_type<Type...>::type, sizeof...(Type)> make_array(Type&&... t) 
{ 
    return {std::forward<Type>(t)...}; 
} 

int main() { 
    auto arr = make_array(Foo{1}, Foo{2}); 
    return 0; 
} 

olarak Açıklamalarda belirttiği .. sizin için örnekleri oluşturmasını sağlamak işleri, std::array<Foo, 2> arr = {Foo{1}, Foo{2}} yapabilirsiniz.

Yayınınızda move'u denediğinizi fark ettim. Sınıfınızın moveable olduğundan emin misiniz?

+0

Eğer 'Foo' hareketli ise, fonksiyona ihtiyacınız yoktur. Sadece 'std :: dizi arr {1, 2};' yeterlidir. – Barry

+0

Ahh haklısın. OP tam olarak önerdiğin şeyi yapmaya çalışıyordu. Std :: move (Foo) 'yu yapıyordu. – Brandon

5

ekstra şeyler için gerek yok, sadece doğrudan başlatılamıyor: T tüm örnekleri sadece akıllı işaretçiler üzerinden erişilebilir gerektiği gibi

class Foo { 
public: 
    Foo() = delete; 
    Foo(int,char) {} 

    Foo(Foo const &) = delete; 
    Foo & operator = (Foo const &) = delete; 
}; 
std::array<Foo, 2> arr {{ {1, '1'}, {2, '2'} }}; 

DEMO

+0

LOL bir tane daha diş teli seti ... bende unuttum. +1. – Barry

+0

Benim için çalışıyor gibi görünüyor. Std :: array için bu parantez katmanlarının anlamını nereden öğrenebilirim? – Syncopated

İlgili konular