Tôi có một số loại có tiểu loại có cùng tên từng:Tuỳ chỉnh biên dịch thông báo lỗi khi không xác định kiểu phụ được truy cập
struct TypeA {
typedef int subtype;
};
struct TypeB {
typedef float subtype;
};
và cả các loại mà không có kiểu phụ này nhưng được sử dụng trong cùng một ngữ cảnh:
struct TypeC {
// (no subtype defined)
};
Làm cách nào để thêm một loại phụ giả tạo thông báo lỗi biên dịch tùy chỉnh?
của tôi (cho đến nay không thành công) cố gắng là:
struct TypeC {
struct subtype {
static_assert(false, "Attempt to access the non-existent subtype of TypeC.");
};
};
Nhưng static_assert(false, ...)
không thể làm việc, như trình biên dịch ném lỗi ngay cả khi loại không bao giờ truy cập.
Làm cách nào để trì hoãn việc đánh giá static_assert
cho đến khi loại truy cập được truy cập?
Một thất bại nỗ lực là để giới thiệu một enum giả và xây dựng một biểu hiện của nó:
enum { X };
static_assert(X != X, "...");
trường hợp sử dụng bê tông: Tôi có một tầm cỡ mẫu List
được định nghĩa với phụ loại head
và tail
nếu không trống, và nên đưa ra một lỗi nếu các tiểu loại được sử dụng nếu nó là rỗng:
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;
};
Nếu tôi chỉ cần loại bỏ các loại head
và tail
, khi truy cập ví dụ: phần tử thứ 3 của danh sách có kích thước 2 với mã số List<int,int>::tail::tail::head
mang lại thông điệp không đẹp (g ++ 4.7.2): 'head' is not a member of 'List<int>::tail {aka List<>}'
Ví dụ 'List <>' đó không phàn nàn về 'static_assert'? Tôi nghĩ rằng các biểu thức liên tục cần thiết để liên quan đến một tham số mẫu để tránh đánh giá ngay lập tức. – aschepler
Hmm, dummy enum [dường như không hoạt động] (http://coliru.stacked-crooked.com/a/602ff84bdc70c08e). –
@aschepler Nó hoạt động với g ++ 4.7.2, không chắc chắn về các trình biên dịch khác hoặc thậm chí là tiêu chuẩn. – leemes