2010-10-20 41 views
56

Tôi đang đọc Scott Meyers 'Effective C++. Anh ấy đang nói về các đặc điểm, tôi hiểu rằng tôi cần chúng để xác định loại đối tượng trong suốt thời gian biên soạn, nhưng tôi không thể hiểu được lời giải thích của anh ta về những gì các lớp này thực sự làm? (từ quan điểm kỹ thuật)các lớp đặc điểm hoạt động như thế nào?

Trả lời

45

Có lẽ bạn đang mong đợi một loại phép thuật nào đó làm cho các đặc điểm kiểu hoạt động. Trong trường hợp đó, hãy thất vọng - không có phép thuật. Loại đặc điểm là theo cách thủ công được xác định cho từng loại. Ví dụ: xem xét iterator_traits, cung cấp typedef (ví dụ: value_type) cho trình lặp.

Sử dụng chúng, bạn có thể viết

iterator_traits<vector<int>::iterator>::value_type x; 
iterator_traits<int*>::value_type y; 
// `x` and `y` have type int. 

Nhưng để làm cho công việc này, có thực sự là một định nghĩa rõ ràng đâu đó trong <iterator> tiêu đề, mà đọc một cái gì đó như thế này:

template <typename T> 
struct iterator_traits<T*> { 
    typedef T value_type; 
    // … 
}; 

Đây là một chuyên môn từng phần của loại iterator_traits cho các loại biểu mẫu T*, tức là con trỏ của một số loại chung chung.

Trong cùng một mạch, iterator_traits chuyên dùng cho các trình lặp khác, ví dụ: typename vector<T>::iterator.

+4

+1 không có phép thuật. Mặc dù, không có một số đặc điểm (ví dụ: trong thư viện chuẩn C++ 0x) không thể được xác định một cách đáng tin cậy chỉ bằng ngôn ngữ và cần sự trợ giúp đặc biệt "ma thuật" từ trình biên dịch để hoạt động? – UncleBens

+0

@UncleBens: Tôi không biết những đặc điểm nào C++ 0x xác định nhưng tôi chắc chắn rằng không có những đặc điểm như vậy tồn tại trước C++ 0x. –

+2

Bây giờ không phải là * một loại ma thuật hoạt động trong ['std :: bases_type'] (http://en.cppreference.com/w/cpp/types/underlying_type)? – Wolf

38

Lớp học nâng cao làm không xác định loại đối tượng. Thay vào đó, chúng cung cấp thông tin bổ sung về một loại, thường bằng cách xác định typedefs hoặc hằng số bên trong đặc điểm.

+5

+1 để kết hợp hiệu quả lý thuyết và triển khai. –

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