2016-03-26 32 views
2

Aslında, sabit içeriği korumak için boyutu şablon parametresi olan bir diziye sahip bir şablon sınıfı istiyorum. gibiŞablon üyesi dizisini constructor parametresinden nasıl başlatılır?

şey: Ben arama ve biraz müdahalesi ve neredeyse bir çözüm bir ara statik yöntemle uygulayan ve std :: dizi kullanıyoruz

template<size_t S> struct Foo { 
    const int bar[S]; 
    Foo(const int(&par)[S]) : bar(par) { 
     cout << "bar size is " << S << endl; 
    } 
}; 
auto foo = Foo({1,2,3}); 

:

template<size_t S> struct Baz { 
    const array<int,S> qux; 
    Baz(const array<int,S>&par) : qux(par) { 
    cout << "size is " << S << endl; 
    } 
}; 
template<size_t S> Baz<S> 
GetBaz(const array<int,S>&in) { 
    return Baz<S>(in); 
} 

int main() { 
    auto sample = GetBaz({1,2,3}); 
    return 0; 
} 

.. Zaten oldukça boilerplate olan, ancak hala std :: array bir başlatıcı listesinden oluşturulmuş gibi görünmüyor mu? :-(

Tamamen soruları anlaşılmış ise
prog.cpp: In function 'int main()': 
prog.cpp:27:30: error: no matching function for call to 'GetBaz(<brace-enclosed initializer list>)' 
    auto sample = GetBaz({1,2,3}); 
+0

Dizideki yerleşik, std :: 'oto numune için –

+0

array'' kullanmalıdır ile bunu yapamaz = GetBaz ({1,2,3}); '' GetBaz <5> 'ya da her neyse belirtmeniz gerektiğinden başarısız olur. Başlatıcı listesi uzunluğu türlerinin bir parçası değildir. –

+1

[Bu yanıttaki kod] (http://stackoverflow.com/a/6114359/1505939), 'GetBaz (1,2,3)' seçeneğini ekstra kullanmadan kullanmak istediğinizde sorununuzu çözmenize yardımcı olabilir –

cevap

5

Post-DR1591 yerleşik dizisi bağlı artık hazırladı-init-listeden bir sonucu değildir vardır , böylece:

template<size_t S> struct Baz { 
    const array<int,S> qux; 
    Baz(const array<int,S>&par) : qux(par) { 
    cout << "size is " << S << endl; 
    } 
    Baz(const int (&par)[S]) : qux(std::experimental::to_array(par)) {} 
}; 

template<size_t S> Baz<S> 
GetBaz(const int (&in)[S]) { 
    return Baz<S>(in); 
} 

std::experimental::to_array bir dahili bir std::array oluşturur. Uygulama için bağlantılı cppreference sayfasına bakın.

Sen yerleşik Diziler tüm yol olabilir, ancak biraz daha sinir bozucu:

template<size_t S> struct Baz { 
    const int bar[S]; 

    template<size_t... Is> 
    Baz(const int (&par)[S], std::index_sequence<Is...>) 
     : bar { par[Is]... } {} 

    Baz(const int (&par)[S]) : Baz(par, std::make_index_sequence<S>()) {} 
}; 

template<size_t S> Baz<S> 
GetBaz(const int (&in)[S]) { 
    return Baz<S>(in); 
} 
+0

Teşekkürler, ben 'deneysel' kullanma hayranı değilim ama cevabınız çok açıklayıcı ve soruya cevap verir. – gatopeich

+0

BTW, eski stil dizileri ile bir eşdeğer biliyor musunuz? Hala orada olanı geliştirmek yerine std :: array neden eklendiğini hala anlamıyorum. – gatopeich

+0

@gatopeich Bakınız düzenleme. –

2

emin değil ne elde etmek çalıştığınız

#include <iostream> 
#include <array> 

template<size_t S> struct Baz { 
    const std::array<int,S> qux; 
    Baz(const std::array<int,S>& par) : qux(par) { 
     std::cout << "size is " << qux.size() << std::endl; 
    } 
}; 

int main() { 
    auto sample = Baz<5>({1,2,3}); // size = 5, values = 1, 2, 3, 0, 0 
    return 0; 
} 

Özeti mı:.?

  1. ham yerine bir std::array kullanın
  2. Şablon argümanını belirtin, örn .: Baz<5>(...). Sınıf şablonu ar Gemsler çıkarılmaz.
+0

parantezleri Kesinlikle, dizi boyutu çıkarım :-) istiyorum. Sınıf şablon argümanlarının _from constructor_'dan çıkarılamayacağını biliyorum, ancak bunun için bir GetBaz() 'statik işlevi kullanmaya hazırım. İyi bir şekilde çözemediğim sorun, başlatıcı listesini ara işlev aracılığıyla yapıcıya geçirmektir. – gatopeich

0

Klasik bir C dizisi ile bunu ancak variadic yapıcı

kullanarak yapabilirsiniz
#include <array> 
#include <cstddef> 
#include <iostream> 

using namespace std; 

template <size_t S> struct Foo { 
    const int bar[S]; 
    const std::array<int, S> bar2; 

    template <typename ... I> 
     Foo (const I & ... i) : bar {i...}, bar2 {{i...}} 
    { 
     cout << "bar size is " << S << " == " << 
     (sizeof(bar)/sizeof(bar[0])) << " == " << bar2.size() << endl; 
    } 
}; 

int main() 
{ 
    Foo<3> foo {1,2,3}; 

    auto foo2 = Foo<4>{1,2,3,4}; 

    return 0; 
} 
İlgili konular