2009-10-16 31 views
5
class A {} 
    A a; 
    type_info info = typeid (a); // error type_info is private 

tôi muốn danh sách list<type_info> để lưu trữ loại lớp học. Có giải pháp nào không?Cách lưu trữ TypeInfo

+0

thể trùng lặp của [Tại sao std :: kiểu \ _info noncopyable? Tôi có được phép lưu trữ nó ở đâu đó không?] (Http://stackoverflow.com/questions/5330835/why-is-stdtype-info-noncopyable-am-i-allowed-to-store-it-somewhere) –

Trả lời

4

Bạn không thể khởi tạo trực tiếp các đối tượng của lớp type_info, vì lớp chỉ có một hàm tạo bản sao riêng. Vì danh sách cần hàm tạo bản sao ...

Nếu bạn thực sự cần nó, hãy sử dụng std :: list < type_info *>.

Tôi không biết tại sao bạn cần danh sách này, nhưng tôi sẽ nghĩ đến một thiết kế thay thế, không liên quan đến RTTI, nếu có thể.

+0

thực sự là ý định của tôi là tạo bản đồ . Cho một typeinfo instantiating loại khác. cách sử dụng mẫu: Nhận (typeof (PageA)) cho tôi lớp StyleA –

+2

Sau đó, bạn thực sự nên sử dụng một số thứ như id lớp mà bạn tự tạo. –

+2

Nếu bạn biết rằng bạn đang đối phó với PageA tại thời gian biên dịch, bạn nên đặt một typedef bên trong PageA. Ví dụ: lớp trangA { công khai: typedef StyleA style_t; // .... }; Sau đó, khi bạn muốn khởi tạo Kiểu thích hợp, bạn chỉ cần thực hiện: "PageA :: style_t mystyleinstance;". –

8

Bạn không thể tạo bản sao của các đối tượng 'type_info'. Tuy nhiên, kết quả nếu 'typeid' là một Lvalue và các đối tượng 'type_info' tương ứng, một khi thu được, tiếp tục sống cho đến cuối chương trình. Vì những lý do này, bạn có thể lưu trữ an toàn con trỏ vào đối tượng 'type_info' trong danh sách của mình.

1

Từ nhận xét của bạn đến câu trả lời của Cătălin Pitiș, tôi hiểu rằng mục tiêu của bạn là viết một hàm trả về loại "Kiểu" khác cho các loại "Trang" khác nhau. Điều này có phải là năng động? Nếu không, một cái gì đó như thế này sẽ làm những gì bạn muốn?

template<class PageT> 
struct StyleOf; 

template<> 
struct StyleOf<PageA>{ 
    typedef StyleA type; 
}; 

template<> 
struct StyleOf<PageB>{ 
    typedef StyleB type; 
}; 

// etc... 

template<class PageT> 
typename StyleOf<PageT>::type 
GetStyle(const PageT&){ 
    return StyleOf<PageT>::type(); 
} 

Hoặc, với Boost.MPL:

using boost::mpl::map; 
using boost::mpl::pair; 

typedef map< 
    pair<PageA, StyleA>, 
    pair<PageB, StyleB>, 
    //etc. 
> 
PageToStyle; 

Bắt kiểu Style từ trang loại là:

boost::mpl::at<PageToStyle, Page>::type; 
Các vấn đề liên quan