2012-01-10 35 views
10

Tôi có một lớp RAII đơn giản để đảm bảo một số xử lý được xử lý đúng cách. Bây giờ tôi muốn khẳng định rằng không ai sẽ thêm ngẫu nhiên bất kỳ phương pháp ảo nào vào nó. Cách tôi nhìn thấy nó, tôi cần phải khẳng định rằng lớp không có con trỏ vtbl.Làm thế nào để khẳng định rằng một lớp cụ thể không có bất kỳ con trỏ vtbl nào trong bố cục của nó?

Tôi có thể làm như thế nào? Có thể khẳng định vào thời gian biên dịch không?

EDIT

tôi sẽ giải quyết cho các trình biên dịch để bàn. Theo tôi biết không có trình biên dịch C++ trên máy tính để bàn không sử dụng vtbl để triển khai đa hình.

+0

Về mặt lý thuyết, Bạn không thể thực hiện việc này theo cách di động. –

+0

Bạn có thể muốn nhận một lớp _sealed_: http://stackoverflow.com/q/4712992/96780 –

+2

Vtbl là một chi tiết triển khai. Có thể tồn tại một trình biên dịch không sử dụng các bảng gọi để thực hiện các chức năng ảo. Bạn có muốn giới hạn mình vào một trình biên dịch cụ thể không? – filmor

Trả lời

19

Nếu bạn có một thư viện C++ 11, bạn có thể sử dụng std::is_polymorphic<T>:

Nếu T là một lớp đa hình (có nghĩa là, một lớp khai báo hay thừa hưởng ít nhất một chức năng ảo), cung cấp giá trị hằng số thành viên bằng true. Đối với bất kỳ loại nào khác, giá trị là sai.

+0

Đánh bại tôi với nó, +1. – jrok

+1

+1, đẹp quá! Ngoài ra nếu bạn không có C++ 11 và bạn có Visual C++ có '__is_polymorphic' - http://msdn.microsoft.com/en-us/library/ms177194%28v=VS.90%29.aspx – sharptooth

+0

Nice . Tôi muốn họ giới thiệu thêm các tính năng thông tin/phản hồi kiểu tĩnh trong C++ 11 (như một cách để lấy danh sách các trường/phương thức cho một lớp). Điều này sẽ làm cho nó dễ dàng hơn nhiều để tạo ra một số siêu mã như trình bao bọc cho các ngôn ngữ kịch bản lệnh. – Kos

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