2011-06-30 28 views
11

Giả sử tôi có một số lớp được tạo khuôn mẫu tùy thuộc vào loại T. T có thể gần như bất cứ điều gì: int, int*, pair <int, int> hoặc struct lol; nó không thể là void, một tham chiếu hoặc bất cứ điều gì cv-đủ điều kiện mặc dù. Đối với một số tối ưu hóa, tôi cần phải biết nếu tôi có thể phân lớp T. Vì vậy, tôi cần một số loại đặc điểm is_subclassable, được xác định là kết hợp logic của các đặc điểm cơ bản hoặc thông qua một số thủ thuật SFINAE.Mẫu C++: cách xác định xem loại có phù hợp với phân lớp

Trong ví dụ ban đầu, intint* không thể phân loại được, trong khi pair <int, int>struct lol là.

EDIT: Như litb được chỉ ra bên dưới, các công đoàn cũng không được phân loại và T cũng có thể là loại liên kết.

Làm cách nào để viết loại đặc điểm tôi cần?

+2

Hmm. Liệu [is_class] (http://msdn.microsoft.com/en-us/library/bb982638.aspx) có đủ không? Không chắc. –

Trả lời

13

Bạn muốn xác định đây có phải là lớp không phải là công đoàn hay không. Không có cách nào được biết với tôi để làm điều đó (và tăng cường đã không tìm thấy một cách nào cả). Nếu bạn có thể sống chung với các trường hợp dương tính giả, bạn có thể sử dụng số is_class.

template<typename> struct void_ { typedef void type; }; 

template<typename T, typename = void> 
struct is_class { static bool const value = false; }; 

template<typename T> 
struct is_class<T, typename void_<int T::*>::type> { 
    static bool const value = true; 
}; 

Boost có is_union sử dụng nội dung dành riêng cho trình biên dịch, sẽ giúp bạn tại đây. is_class (mà tăng cường cũng cung cấp) kết hợp với is_union sẽ giải quyết vấn đề của bạn.

+0

Tôi đã quên hoàn toàn trường hợp công đoàn. Thật không may, không có sự chấp nhận sai. Thiếu là, vì đây là một tối ưu hóa sau khi tất cả. – doublep

+0

@doublep sau đó trừ khi bạn đang sử dụng C++ 0x, tôi không nghĩ rằng nó có khả năng giải quyết theo cách di động. –

+0

Vâng, tôi đoán tôi sẽ phải thực hiện tối ưu hóa có điều kiện về hỗ trợ C++ 0x hoặc chỉ cần thả nó sau đó. – doublep

Các vấn đề liên quan