Để thay thế cho việc khai báo một lớp đặc điểm sử dụng SFINAE, bạn có thể sử dụng nó một cách tinh tế hơn với chuyên môn từng phần.
template< typename T >
struct empty { // support class is like stripped-down enable_if
typedef void type;
};
template< class T, typename v = void > // v is always void!
struct element {
typedef typename T::value_type type;
};
template< class T, typename v >
struct element< T const, v > {
typedef typename T::value_type const type;
};
template< class T > // T in deduced context, T::element_type is SFINAE:
struct element< T, typename empty< typename T::element_type >::type > {
typedef typename T::element_type type;
};
... bạn có thể muốn thêm một trường hợp khác để làm cho element_type
const cho const T
? Thật không may điều này không làm việc trong GCC, mặc dù Comeau chấp nhận nó.
template< class T >
struct element< T const, typename empty< typename T::element_type >::type > {
typedef typename T::element_type const type;
};
Mã tôi sử dụng để kiểm tra điều này:
struct has_et {
typedef int element_type;
};
struct has_vt {
typedef char value_type;
};
char c;
int i;
element<has_vt>::type *cp = &c;
element<has_et>::type *ip = &i;
Đối với phần đầu tiên, bạn có thể đọc về SFINAE (google nó) và bạn đang bị ràng buộc để tìm ví dụ minh họa chỉ là những gì bạn cần –
Các bài viết wikipedia trên SFINAE thực sự bao gồm một ví dụ về việc kiểm tra một typedef, được viết bởi bạn thực sự. : P – GManNickG
Không có cách nào để phát hiện rằng typedef, nếu nó tồn tại, là công khai. Tiêu chuẩn này đặc biệt cấm SFINAE làm việc với vi phạm điều kiện truy cập. – Potatoswatter