tanımsız alt tip erişildiğinde hata iletisi derleme: kullanılan bu alt türü var ama yokÖzel Ben aynı adla alt türleri her olan bazı türlerine sahip
struct TypeA {
typedef int subtype;
};
struct TypeB {
typedef float subtype;
};
ve ayrıca tiplerini
struct TypeC {
// (no subtype defined)
};
Nasıl özel hata mesajı derlemek veren bir kukla alt türünü ekleyebilirsiniz: aynı bağlamda?
Benim (şimdiye kadar başarısız) girişimdir:
struct TypeC {
struct subtype {
static_assert(false, "Attempt to access the non-existent subtype of TypeC.");
};
};
Ama static_assert(false, ...)
çalışamaz, derleyici tür erişilen asla bile hata atar olarak.
Türün erişilebilir olduğu zamana kadar static_assert
değerlendirmesini nasıl geciktirebilirim?
enum { X };
static_assert(X != X, "...");
beton kullanım durumunda: bir alt tanımlanan bir sınıf şablon List
sahip
bir girişimi bunun dışında bir ifade, bir sahte enum tanıtmak ve inşa etmektir başarısız tipleri head
ve tail
boş olmayan ise, bu alt tipleri kullanılırsa o boşsa bir hata vermelidir:
template<typename...>
struct List;
// empty list:
template<>
struct List<> {
struct head { static_assert(false, "Attempt to access the head of an empty list."); };
struct tail { static_assert(false, "Attempt to access the tail of an empty list."); };
};
// non-empty list:
template<typename Head, typename ...Tail>
struct List<Head, Tail...> {
typedef Head head;
typedef List<Tail...> tail;
};
Yalnızca head
ve tail
türlerini, örn. koduyla List<int,int>::tail::tail::head
ile büyüklüğü 2 olan bir listenin 3 eleman (g ++ 4.7.2) öylesine güzel mesaj veriyor: 'head' is not a member of 'List<int>::tail {aka List<>}'
Bu 'List <>' örnek 'static_assert's hakkında şikayet etmiyor? Derhal değerlendirmeyi önlemek için şablon parametresi içermesi gereken sürekli ifadeyi düşündüm. – aschepler
Hmm, kukla enum [işe yaramıyor] (http://coliru.stacked-crooked.com/a/602ff84bdc70c08e) ya da. –
@aschepler Diğer derleyicilerden ve hatta standartlardan emin olmadığından g ++ 4.7.2 ile çalışır. – leemes