2015-04-23 13 views
5

Fill<T, Pack, Size, Value>, Değer yinelenen Boyut süreleri olan Pack<Value, Value, ..., Value> türünde olmalıdır. Birisi açıklayabilir, neden bu belirsizdir? Bu süreBirisi neden burada belirsizliği açıklıyor, lütfen?

template <typename T, template <T...> class Pack, int Size, int Count, typename Output, T Value> 
struct FillHelper; 

template <typename T, template <T...> class P, int Size, int Count, T... Output, T Value> 
struct FillHelper<T, P, Size, Count, P<Output...>, Value> : 
    FillHelper<T, P, Size, Count + 1, P<Output..., Value>, Value> {}; 

template <typename T, template <T...> class P, int Size, T... Output, T Value> 
struct FillHelper<T, P, Size, Size, P<Output...>, Value> { 
    using type = P<Output...>; 
}; 

template <typename T, template <T...> class P, int Size, T Value> 
using Fill = typename FillHelper<T, P, Size, 0, P<>, Value>::type; 

template <int...> struct Pack; 

int main() { 
    using T = Fill<int, Pack, 10, 4>; 
} 

değildir:

template <typename T, int Size, int Count, typename Output, T Value> 
struct FillHelper; 

template <typename T, template <T...> class P, int Size, int Count, T... Output, T Value> 
struct FillHelper<T, Size, Count, P<Output...>, Value> : 
    FillHelper<T, Size, Count + 1, P<Output..., Value>, Value> {}; 

template <typename T, template <T...> class P, int Size, T... Output, T Value> 
struct FillHelper<T, Size, Size, P<Output...>, Value> { 
    using type = P<Output...>; 
}; 

template <typename T, template <T...> class P, int Size, T Value> 
using Fill = typename FillHelper<T, Size, 0, P<>, Value>::type; 

template <int...> struct Pack; 

int main() { 
    using T = Fill<int, Pack, 10, 4>; 
} 

Ben dolaylı ikinci kısa ve ilkinden böylece iyi olduğunu fark ettim, ama ilki derlemek için bir neden şaşkın olduğu ortaya çıkıyor. Son zamanlarda GCC 4.9.2 ile hata alıyorum. Visual Studio 2013 ile de hata. Bu arada, ikinci koddan daha iyi bir çözüm karşılandı.

Güncelleme: sorunu daha azaltılması, bu GCC 4.9.2 (ve çok Visual Studio 2013) ile derlemek ETMEZ çünkü uzmanlık şablon-şablonun varlığı problemi değildir çıkıyor:

template <typename T, template <T...> class Pack, int Size, int Count> 
struct F; 

template <typename T, template <T...> class P, int Size, int Count> 
struct F : F<T, P, Size, Count + 1> {}; 

template <typename T, template <T...> class P, int Size> 
struct F<T, P, Size, Size> { 
    using type = int; 
}; 

template <int...> struct Pack; 

int main() { 
    using T = F<int, Pack, 10, 0>::type; 
} 

GCC ve VS ile kafa karışıklığına neden olan ilk koddaki sorun tam olarak nedir?

+0

FWIW, hatasız ilki aşağı çınlama 3.6 Munches. Bilgi: Apple LLVM sürüm 6.1.0 (clang-602.0.49) (LLVM 3.6.0svn'ye göre). Belki de araç zinciri bilginizi ekleyin. – WhozCraig

+0

Son zamanlarda GCC 4.9.2 ile hata alıyorum. Visual Studio 2013 ile de hata. – prestokeys

+0

Evet, clang gerçekte bizden daha akıllı, çünkü aslında bunun dışında * kullanılan *. 'T'; '' 'ana()' nin eklenmesi bir doz verir: main.cpp: 23: 7: Tanımlanmamış şablonun örtük şekilde oluşturulması 'Pack <4, 4, 4, 4, 4, 4, 4, 4, 4 4> '. Her ne kadar olursa olsun, bilmek faydalı olabilir. ** düzenle ** nm. '{};' 'Pack' sonrası ekleyerek bir kez daha derler. – WhozCraig

cevap

1

Neden gcc kodunuzu reddediyor bilmiyorum, ancak C++ 14 desteğiniz varsa, daha az sıkıcı bir çözüm Size öğelerine sahip bir paket oluşturmak için std::make_index_sequence öğelerini kullanmaktır, sonra paketi çıkartın ve yeniden genişletin, gibi pek:

template <typename T, template <T...> class Pack, T Value, size_t... indices> 
auto FillHelper(std::index_sequence<indices...>) -> Pack<(indices, Value)...>; 

template <typename T, template <T...> class P, int Size, T Value> 
using Fill = decltype(FillHelper<T, P, Value>(std::make_index_sequence<Size>())); 

Bağlantı: http://coliru.stacked-crooked.com/a/7771560a1f32461d

+0

Güzel! Virgül operatörü kullanmayı hiç düşünmemiştim. Burada sadece bir kukla operatör olduğu için, 'Size' uzunluğunun herhangi bir index_sequence çalışacağını tahmin ediyorum. – prestokeys

İlgili konular