2011-02-11 32 views
9

Tôi đã lưu một con trỏ tới một đối tượng type_info.Làm cách nào để tạo kiểu chữ với type_info?

int MyVariable = 123; 
const std::type_info* Datatype = &typeid(MyVariable); 

Tôi có thể sử dụng điều này để định kiểu biến khác cho loại đó như thế nào? Tôi cố gắng này, nhưng nó không hoạt động:

std::cout << ((*Datatype)3.14) << std::endl; 

Sử dụng các hình thức chức năng của typecasting không làm việc, hoặc là:

std::cout << (*Datatype(3.14)) << std::endl; 

Trả lời

4

Tôi không nghĩ rằng việc truyền như vậy có thể được thực hiện. Giả sử bạn có thể thực hiện thao tác "năng động" như thế này khi chạy (không có nghĩa là dynamic_cast). Sau đó, nếu bạn sử dụng kết quả của các diễn viên để gọi một chức năng trình biên dịch không còn có thể làm loại kiểm tra trên các thông số và bạn có thể gọi một cuộc gọi chức năng mà không thực sự tồn tại.

Do đó, điều này không thể thực hiện được.

+0

Nếu bạn sử dụng kiểu C hoặc reinterpret_cast bạn nhận được cùng một vấn đề, vì vậy tôi không nghĩ rằng đó là một đối số hợp lệ. –

+1

@Mark Ransom Kết quả của một trong hai loại dàn diễn viên đó là * được biết tại thời gian biên dịch *. Nội dung của '* DataType' có thể thay đổi theo thời gian chạy. –

+2

vào thời điểm đó tôi nghĩ rằng chúng tôi đồng ý và tôi đã nói nhiều trong câu trả lời của tôi. Trường hợp tôi không đồng ý là vấn đề mất kiểm tra kiểu sẽ là một lý do cho việc này không hoạt động. Nếu bạn gán một 'foo *' vào một 'bar *' và gọi một phương thức trên nó, bạn có thể gọi một cuộc gọi hàm không thực sự tồn tại - hôm nay, bằng cách sử dụng các phôi mà tôi đã đề cập. –

16

Đơn giản chỉ cần bạn không thể làm điều đó bằng type_info. Ngoài ra, trong ví dụ của bạn DataType không phải là loại, đó là một con trỏ cho một đối tượng thuộc loại type_info. Bạn không thể sử dụng nó để truyền. Truyền yêu cầu loại, không phải con trỏ hoặc đối tượng!


Trong C++ 0x, bạn có thể làm điều này tuy nhiên,

int MyVariable = 123; 

    cout << (decltype(MyVariable))3.14 << endl; 

    cout << static_cast<decltype(MyVariable)>(3.14) << endl; 

Output:

3 
3 

Online Demo: http://www.ideone.com/ViM2w

+1

Blech. Một lý do khác để chờ C++ 0x. – Maxpm

+0

@Maxpm, phần lớn C++ 0x có sẵn trong Boost, vì vậy tôi đã tìm kiếm: http://www.boost.org/doc/libs/1_35_0/doc/html/typeof.html –

+0

@Mark Ransom: Tôi nghĩ 'Boost.Typeof' không phải là di động, hoặc đơn giản là không làm việc với tất cả các trình biên dịch, vì nó sử dụng phần mở rộng của trình biên dịch nội bộ. Xem chủ đề này: [Thiếu vắng toán tử typeof trong C++ 03?] (Http://stackoverflow.com/questions/4533758/absence-of-typeof-operator-in-c03) – Nawaz

3

Typecasting không phải là một run- quy trình thời gian, đây là quy trình biên dịch ít nhất đối với loại bạn đang truyền đến. Tôi không nghĩ rằng nó có thể được thực hiện.

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