Định dạng của đầu ra là type_info::name()
là cài đặt cụ thể.Có một trình bao bọc di động cho C++ type_info chuẩn hóa định dạng chuỗi kiểu tên không?
namespace N { struct A; }
const N::A *a;
typeid(a).name(); // returns e.g. "const struct N::A" but compiler-specific
Có ai đó viết một gói trả về thông tin đáng tin cậy, có thể đoán trước giống nhau trên các trình biên dịch. Nhiều chức năng templated sẽ cho phép người dùng để có được thông tin cụ thể về một loại. Vì vậy, tôi có thể sử dụng:
MyTypeInfo::name(a); // returns "const struct N::A *"
MyTypeInfo::base(a); // returns "A"
MyTypeInfo::pointer(a); // returns "*"
MyTypeInfo::nameSpace(a); // returns "N"
MyTypeInfo::cv(a); // returns "const"
Các chức năng này chỉ là ví dụ, người có kiến thức tốt hơn về hệ thống loại C++ có thể thiết kế API tốt hơn. Người tôi quan tâm ở số base()
. Tất cả các hàm sẽ tăng ngoại lệ nếu RTTI bị vô hiệu hóa hoặc một trình biên dịch không được hỗ trợ được phát hiện.
Điều này có vẻ giống như những thứ mà Boost có thể triển khai, nhưng tôi không thể tìm thấy nó ở bất kỳ đâu. Có thư viện di động nào không?
Tôi không biết gì cả, nhưng có vẻ như đó là một ý tưởng hay. (Chính thức, tiêu chuẩn cho phép thực hiện trả về '" "' cho tất cả các loại, nhưng thực tế, hầu hết các triển khai trả về một cái gì đó trực tiếp có thể sử dụng được, và những cái không trả lại tên bị xáo trộn, có thể bị phân tách.) –
Tôi có thể thấy là chuỗi này hoàn toàn được triển khai cụ thể và không được đảm bảo để thể hiện chính xác loại chính nó. Thậm chí tệ hơn, nó thậm chí có thể không phải là duy nhất. –
@Matthieu - thư viện phát hiện các trình biên dịch như vậy và cuộc gọi không thành công. Người gọi phải sống với nó.Các trình biên dịch mà hầu hết chúng ta sử dụng cung cấp thông tin hữu ích trong 'type_info'. – paperjam