Şablondan belirlenen bir değerler dizisi verilen değişken boyutta bir renk sınıfı oluşturmaya çalışıyorum, dizideki her değerin adlandırılmış takma adlarını oluşturmak istiyorum yani:C++ (Her nasılsa) yapısını ana birim boyutuna sınırla
template<int C = 3, typename T = unsigned char>
class Color {
public:
union {
T v[C];
struct {
T r, g, b, a;
};
};
};
Ancak, C = 3 için aynı sınıf kullanmak deneyin, birlik görev 4 baytlık bir boyutu ('a' üyesi). Alternatif olarak, bir (a, anonim T üyesi olarak adlandırılan yapı, boyut C> 3'te 1 olarak değerlendirilir) için bir matematiksel olarak ifade edilen bitfield boyutu kullanılarak, derleyici, daha büyük bir uygun olmayan bir izin veren (In gcc, how to mute the -fpermissive warning? uyarınca, baskılamayan bir uyarı) yayınlar. ölçekli API.
Tek bir sınıfa değişken sayılar işlemeye devam ederken, değişken değişken adlarını koruyarak ve özyinelemeli makro sihri uygulamadan (bunu denemeliydim), nasıl kullanmalıyım? Şimdiden teşekkürler!
Düzenleme:
- Durdurulmasına GCC en -fpermissive hataları (#pragma müsamahakar için çalışmıyor göz ardı tanı)
- Set: soru, bu sorunu çözecektir aşağıdakilerden herhangi bir cevap netleştirmek için C baytını geçmeyen birleşim veya alt yapı en fazla boyutu
- C baytları tarafından kapsanmayan üyeler için bit uzunluğunun 0'a izin ver (GCC, (C-3> 0) gibi bit açı uzunluğu için matematiksel ifadelere izin verir? 8: 0;
- C bytes tarafından kapsanmayan üyeleri devre dışı bırak anonim yapılar standart dışı olduğu
template <int C = 3, typename T = unsigned char> union Color; template <typename T> union Color<3,T> { T v[3]; struct { T r,g,b; }; }; template <typename T> union Color<4,T> { T v[4]; struct { T r,g,b,a; }; };
Not: ther araçları (yani efsanevi static_if())
Doğru anlıyorsam, anonim yapıdaki üye sayısının 'C' şablon parametresiyle değişmesini istiyorsunuz? –
Doğru, ideal bir şekilde, bir static_if gibi bir şey ek olarak a, x, y, z, w üyelerini açabilir C> = 4 ... – Precursor
Buna ihtiyacınız var mı? T v [C]; 'şey mi yoksa sadece mi Uygulamaya dahil edilmesini beklediğiniz için bunu dahil edin – jPlatte