2012-10-13 29 views
7

Tôi đã biên dịch mã sau đây với g++ và nhận đầu ra, được viết trong phần bình luận.type_info.name có thể đọc được của con người()

template<class T> 
void foo(T t) { cout << typeid(t).name() << endl; } 

int main() { 
    foo("f");  //emits "PKc" 
    foo(string()); //emits "Ss" 
} 

Tôi biết, rằng type_info.name() không được xếp hạng, nhưng có cách nào để nhận kết quả có thể đọc được không?

giống như sau sẽ là tốt enought

const char * 
class string 
+0

Trừ khi ai đó biết một bản cập nhật cho tiêu chuẩn tôi không biết, 'typeid' được thực hiện được xác định, và như vậy cũng là những giá trị nó trả về. Nếu điều này không còn là trường hợp tôi rất tò mò muốn biết thêm về nó là tốt. Cho đến lúc đó, thuật toán mangling cụ thể cho trình biên dịch của bạn có thể sẽ dẫn bạn đến câu trả lời (và demangling) mà bạn đang tìm kiếm. – WhozCraig

+0

Hoàn toàn phụ thuộc vào việc triển khai. Cl của Microsoft sẽ sử dụng tên tương tự như những gì bạn đang mong đợi. – oldrinb

+0

http://stackoverflow.com/questions/81870/is-it-possible-to-print-a-variables-type-in-standard-c –

Trả lời

13

Bạn có thể sử dụng abi::__cxa_demangle cho rằng (chức năng demangle lấy từ here), chỉ cần nhớ rằng người gọi là trách nhiệm giải phóng sự trở lại:

#include <cxxabi.h> 
#include <typeinfo> 
#include <iostream> 
#include <string> 
#include <memory> 
#include <cstdlib> 

std::string demangle(const char* mangled) 
{ 
     int status; 
     std::unique_ptr<char[], void (*)(void*)> result(
     abi::__cxa_demangle(mangled, 0, 0, &status), std::free); 
     return result.get() ? std::string(result.get()) : "error occurred"; 
} 

template<class T> 
void foo(T t) { std::cout << demangle(typeid(t).name()) << std::endl; } 

int main() { 
    foo("f");   //char const* 
    foo(std::string()); //std::string 
} 

Ví dụ về ideone.

+0

Điều này không hoạt động trên mingw g ++, chương trình đang chết mà không cần ném bất kỳ lỗi nào – srinath29

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