2015-02-13 16 views
7

aşağıda eserleri:Bir std :: adlandırılmamış yapı dizisini başlatmak mümkün mü?

struct 
{ 
    int v; 
} vals[] = { {1}, {2} }; 

ben aynı şeyi yapmak ama bunun yerine bir std::array başlatmak miyim? Bu kadar çok insan soruyor beri

Düzenleme 'Neden'

Orada bazı çok bariz geçici çözümler (yorumlarda listelenmiştir) vardır, ama sadece bir kez türü kullanmak istiyoruz, bu yüzden gerçekten istemiyorum istiyorum mevcut ad alanma eklendi. Bir tuple veya benzer bir şey kullanabilirdim, ancak adlandırılmış değerlere sahip olmak netliği artırıyor. Bir std::array yapıyorum, c-array değerine ihtiyacım yok, bu yüzden decltype kullanamıyorum. Ben yapmak istiyorum

en temiz çözüm: hem akademik ilgi bir unsur bulunmamaktadır

struct 
{ 
    int v; 
} std::array vals = { {1}, {2} }; 

- "değil gerçi ben bir şekilde bu mümkün mü?". değil gibi görünüyor, bu yüzden muhtemelen kullanacağız:

struct 
{ 
    int v; 
} c_array[] = {}; 

std::array<std::remove_reference_t<decltype(c_array[0])>, 2> arr = { {1}, {2} }; 
+0

Eğer 'dizisi ' denediniz mi? –

+2

@MatsPetersson Bu işe yaramaz. –

+4

'struct {int v; foo; std :: array çubuk = {{{1}, {2}}}; '? Ama neden bunu yapmak zorundasınız? –

cevap

4

nedeni yapamayacağınız:

§7.1:

std::array<struct {int v}, 10> arr; 

çünkü N4140 aşağıdaki kural olduğunu .6/3 [...] tip belirleyici-seq, tip-türünde numaralandırma belirtilmemişse, bir sınıf veya numaralandırma tanımlamaz.takma beyanı (7.1.3) bir şablon beyan arasında bildirimi değildir. Bir şablon tipi değişken yana

bir tip-id kullanılarak belirlenen ve tipi kimliği bir tip belirteci seq içerir, bu sınıfın tanımı olamaz.

bir typedef kullanabilir

, fakat:

§9.1/5 A Typedef adı (7.1.3) adları sınıf tipi, ya da bunun bir ev nitelikli versiyonu, aynı zamanda sınıf adı. [...]

Ben T.C. tarafından önerisi ile gider:

struct { int v; } foo; std::array<decltype(foo), 10> bar = {{{1},{2}}}; 
+2

Bu istisna, T = struct {int v; }; 'bir * takma ad bildirimi * bu bir takma ad bildiriminin parçası değildir. Bunun nedeni, 'using' ve 'typedef's arasında tam bir eşleşme istediğidir. –

İlgili konular