Bạn không thể sử dụng C++ để làm những gì bạn muốn.
Nó có thể có thể đạt được câu trả lời một phần nếu bạn giới hạn mình vào một nền tảng nhất định. Ví dụ những nền tảng mà tuân thủ các Itanium ABI sẽ có một thực hiện chức năng này:
extern "C"
void* __dynamic_cast(const void *sub,
const abi::__class_type_info *src,
const abi::__class_type_info *dst,
std::ptrdiff_t src2dst_offset);
Trong ABI này, abi::__class_type_info
là một loại có nguồn gốc từ std::type_info
, và tất cảstd::type_info
s trong chương trình có một loại động bắt nguồn từ std::type_info
(abi::__class_type_info
chỉ là một ví dụ).
Sử dụng ABI này có thể xây dựng một công cụ sẽ điều hướng hệ thống phân cấp thừa kế của bất kỳ loại nào (tại thời gian chạy), với số std::type_info
. Và khi làm như vậy bạn có thể xác định xem hai số std::type_info
có đại diện cho hai loại có thể là dynamic_cast
hoặc thậm chí static_cast
với nhau.
Lưu ý rằng giải pháp như vậy sẽ không tính đến việc chuyển đổi giữa các loại bằng cách sử dụng hàm tạo chuyển đổi hoặc toán tử chuyển đổi. Và ngay cả khi hạn chế đó có thể chấp nhận được, tôi không khuyến khích tuyến đường này. Đây không phải là một dự án dễ dàng, và sẽ rất dễ bị lỗi. Nhưng đây có lẽ là cách thực hiện C++ của bạn thực hiện dynamic_cast
, vì vậy rõ ràng là không thể.
Nguồn
2012-05-08 23:50:53
Tôi không nghĩ điều đó là có thể. Nhưng câu hỏi thực sự là, bạn sẽ làm gì với chức năng như vậy? – Nawaz
Ngoài ra, tại sao bạn chỉ có 'type_info's? – mfontanini
"Điều này hoạt động tốt nếu bạn thực sự biết các loại A và B".Ok, nhưng làm thế nào đến bạn không biết các loại? – jrok