2012-12-16 25 views
2

我試圖創建和存儲TYPE_INFO對象:如何使用的typeid來存儲TYPE_INFO對象

#include <typeinfo> 
int i; 
type_info x = typeid(i); 

,併產生一個錯誤信息。有什麼方法可以存儲type_info對象嗎?

這個背後的歷史是,我試圖爲各種C++整數類型生成測試用例;對它們進行算術運算並確定中間結果是否被提升到下一個最大整數類型或被截斷。那就是:

unsigned char x = 257; 
unsigned char y = 257; 
// is (x + y) == 514 or 256? 

而決定做對靜態數據結構的類型檢查,例如:

int x = <value>; 
int y = <value>; 
static type_info def = { typeid(bool) 
         , typeid(char), typeid(unsigned char) 
         , typeid(short), typeid(unsigned short) 
         , typeid(long), typeid(unsigned long) 
         }; 
type_info obj = typeid(x + y); 
for(int i = 0; i < sizeof(def)/sizeof(def[0]); i++) if (obj == def[i]); break; 

總之,不能沒有能夠存儲TYPE_INFO結構完成,我仍然想了解整數促銷活動。

你可以創建一個type_info對象嗎? gcc 4.5.3實現具有私有分配。

整數升級執行時是否有資源告知?

感謝

+0

你可能更適合使用['std :: numeric_limits'](http://en.cppreference.com/w/cpp/ types/numeric_limits),因爲它提供了您正在測試的信息。只是一個想法。 –

回答

0

在C++ 11,(GCC 4.5.1作品)這樣的事情可能工作:

#include <type_traits> 

template<typename... Types> 
struct Seq {}; 

template<typename T, typename Seq, typename=void> 
struct IndexOf; 

template<typename T, typename First, typename... Types> 
struct IndexOf<T, Seq<First, Types...>, typename std::enable_if< std::is_same<T, First>::value >::type > { 
    enum { value = 0 }; 
}; 
template<typename T, typename First, typename... Types> 
struct IndexOf<T, Seq<First, Types...>, typename std::enable_if< !std::is_same<T, First>::value >::type > { 
    enum { value = 1+IndexOf<T,Seq<Types...>>::value }; 
}; 

typedef Seq< bool, char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long > IntegerTypes; 

#include <iostream> 

int main() { 
    int x = 7; 
    int y = 10; 
    std::cout << IndexOf< decltype(x+y), IntegerTypes >::value << "\n"; 
    // this next line will not compile, because void is not in the IntegerTypes sequence: 
    // std::cout << IndexOf< void, IntegerTypes >::value << "\n"; 
} 

,但你會注意到它不依賴於的值x或y,只是他們的類型。

請注意,所有的邏輯都是在編譯時完成的,而不是在運行時完成的。如果你傳遞了一個不在列表中的類型,你會得到一個錯誤消息(它的正確解釋是「找不到」)。我本可以縮短錯誤信息,但我很懶。 :)

+0

我沒有使用這個解決方案。我需要回答的問題是計算是否會導致整數提升(例如(x << 1)+ 1,其中x = 0x80,是答案'1'還是'0x101?')。我不確定靜態評估會產生正確的結果。但是,謝謝。 – skidmarks

+0

@ user426696 C++中的算術表達式的類型是靜態評估的。 '(x << 1)+ 1'的類型不依賴於'x'的值。 – Yakk

1

typeid()返回一個const type_info &type_info有一個私人拷貝構造函數,所以你不能建立你描述的數組。我找不到任何東西來表明它們是否持久,但你可以試試type_info *a[] = { &typeid(int), ... }

+0

謝謝。訣竅了。實際代碼是: [code] type_info * x = const_cast (&typeid(uCha​​r)); [/ code] – skidmarks

相關問題