2012-05-08 25 views
5

Trong C++ 11 có thể xác định xem một biến loại A có thể được chuyển đổi hoàn toàn thành loại B theo using std::is_convertible<A, B> hay không.std :: is_convertible cho type_info

Đ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, nhưng tất cả những gì tôi có là type_infos. Vì vậy, những gì tôi đang tìm kiếm là một chức năng như thế này:

bool myIsConvertible(const type_info& from, const type_info& to); 

Có thể thực hiện điều gì đó tương tự trong C++ không? Nếu vậy, làm thế nào?

+5

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

+0

Ngoài ra, tại sao bạn chỉ có 'type_info's? – mfontanini

+0

"Đ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

Trả lời

1

Tôi đoán điều này có thể được thực hiện trong trường hợp bạn biết typeid của biến của bạn, Mà bạn luôn có thể biết bằng cách sử dụng toán tử typeid trong C++.

Derived* pd = new Derived; 
    Base* pb = pd; 
    cout << typeid(pb).name() << endl; //prints "class Base *" 
    cout << typeid(*pb).name() << endl; //prints "class Derived" 
    cout << typeid(pd).name() << endl; //prints "class Derived *" 

Sau đó, bạn sẽ phải tạo một multimap hoặc với phím như typeid (mà bạn muốn biết nếu là chuyển đổi thành) và giá trị như convertible type ids (loại convertable) Trong trường hợp như thế nào nếu. Trong trường hợp này, bạn có thể truy cập bản đồ để tìm kiếm nếu key trong trường hợp của bạn const type_info& from có một số value được ánh xạ tới const type_info& to. Nếu Có thì bạn có thể trả lại bool là true hoặc false. Nhưng trong trường hợp này bạn cần đảm bảo rằng bạn thấy tất cả các lớp và có thừa kế trong mã đúng cách. Và trên cơ sở quyết định nếu nó sẽ là một chuyển đổi hợp pháp và thêm vào bản đồ trên cơ sở đó. Nhưng đây sẽ là một quá trình tẻ nhạt và tôi không thấy việc sử dụng nó.

Toàn bộ C++ cho phép bạn biết thông qua dynamic cast nếu loại có thể được truyền sang loại khác hoặc không đúng cách. Trong khi static_cast thậm chí sẽ cast các loại không thể phối hợp với nhau và sử dụng không đúng cách sẽ dẫn đến lỗi thời gian chạy

4

Bạn không thể sử dụng C++ để làm những gì bạn muố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ể.

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