static_assert
'un yararlılığını anlamaya çalışıyorum ve bir tasarımın uygulanmasında bana yardımcı olup olmayacağını öğrenmek istiyorum ve eğer öyleyse nasıl.Statik_assert üzerinden şablon türü zorlayın
Kendi uygulamanızı, şablon türünün boyutuna göre kısmen özelleştirilmiş olan başka bir şablon sınıfında gizleyen genel bir şablon sınıfım var. İşte bu tasarımın kısa bir anahat: T
büyüklüğü Yardımcısı bir uzmanlaşma tarafından desteklendiği takdirde
template <class T, size_t S = sizeof(T)>
struct Helper;
template <class T>
struct Helper<T, sizeof(long)>
{
static T bar();
};
// ... other specializations ...
template <class T>
class Foo
{
public:
T bar()
{
return Helper<T>::bar();
}
};
Foo desteklenir. Örneğin, Foo<long>
ve Foo<unsigned long>
her ikisi de desteklenmektedir. Bununla birlikte, kullanıcının bir Foo<bool>
oluşturmayı denediğini varsayalım. Normalde, bu hata üretecektir çünkü Yardımcı'un bool
için özelleşmesi tanımlanmamıştır, bu da amaçlanan davranıştır.
Bu arabirimdeki kullanıcı için daha yararlı hatalar sağlamak amacıyla bu tasarımda static_assert
'u kullanmanın bir yolu var mı?
Ayrıca, boyut doğru olsa bile, kullanıcının belirli bir tür kullanmasını kısıtlamak isterim. Örneğin, Foo<float>
'a izin verilmemelidir. Şu an bunu benimsemeyi bildiğim tek yol, belgelerdeki cesur bir yorum. sadece şablon sınıfın bir uzmanlık için çalışabilir varsa :)
Daha genel olarak düşünün, sadece desteklenen tamsayı türleri mi? Hayır "char", "bool", "float" ve diğerleri? – Rapptz
Şablon türü kısıtlamaları veya "kavramlar" için SO ara. Bunu yapmak için bir tesis son dakikada C++ 11'den kaldırıldı. Benzer sonuçlara ulaşmak için daha az otomatik yol vardır. – luke
@Rapptz, 'char',' int' ve 'long', 'unsigned' sürümleriyle birlikte desteklenmelidir. 'Int', 'long' ve' unsigned long' için de özdeş olacaktır. – Zeenobit