Tôi đang làm việc trên thư viện đôi khi thậm chí sử dụng các loại - thở hổn hển! - thậm chí không phải là được xác định, ít có nhiều thành viên dữ liệu hơn!
Đó là, loại không đầy đủ, chẳng hạn như
struct foobar;
này được sử dụng để tạo ra một cái tên rõ ràng, không có gì hơn.
Vì vậy, điều này hữu ích cho điều gì? Vâng, chúng ta sử dụng nó để tạo ra khác biệt thẻ, sử dụng bổ sung (trống rỗng, nhưng xác định đầy đủ) một loại:
template <typename TSpec>
struct Tag { };
Bây giờ bạn có thể tạo thẻ riêng biệt như vậy:
struct TagForward_;
typedef Tag<TagForward_> ForwardTag;
struct TagRandomAccessible_;
typedef Tag<TagRandomAccessible_> RandomAccessibleTag;
Những lần lượt có thể được sử dụng để phân biệt các tình trạng quá tải chuyên biệt. Nhiều triển khai STL làm điều gì đó tương tự:
template <typename Iter>
void sort(Iter begin, Iter end, RandomAccessibleTag const&) …
Nói đúng ra, con đường gián tiếp thông qua một chung Tag
lớp mẫu là không cần thiết, nhưng đó là một mẹo hữu ích vì lợi ích của tài liệu.
Tất cả điều này chỉ để cho thấy rằng một hệ thống loại (nghiêm ngặt, tĩnh) có thể được sử dụng theo nhiều cách khác nhau hơn là chỉ gói và đóng gói dữ liệu.
Nguồn
2010-08-01 19:01:28
không phải tất cả các lớp đều có vtable, vì vậy điều đó không liên quan. – tenfour
Cũng không làm vtables có bất cứ điều gì để làm với C + +. Họ chỉ là một kỹ thuật thực hiện phổ biến (và do đó không có gì để làm với ngôn ngữ) để thực hiện kế thừa (nhưng không phải là duy nhất). –
Câu hỏi rõ ràng tôi sẽ hỏi là tại sao không cho phép các đối tượng có kích thước bằng không. Thực tế là nó là loại duy nhất có thông tin có thể được sử dụng. –