2016-01-05 42 views
1

我想編寫類似於C++ 11中的std::array的類。要做到這一點,我 宣佈這個類裏面的char類型的表,後來我想在這個表上調用 placement new之後,我想使用表,如果它是T類型的常規表,並且麻煩來了。C++將原始表格轉換爲其他表格類型

一般變量,如:

char tab[size]; 

char(&)[size]的類型,如果是這樣的,所以我想用reinterpret_cast在此表上丟給類型的表中,我實際上是使用,所以更多的還是少,我想我的代碼看起來像這樣:

char tab[sizeof(T)*size]; 
T tabT[size] = reinterpret_cast<T(&)[size]>(tab); 
// more code using tabT 
在這種情況下標籤

然而,被視爲char*類型。究其原因,爲什麼我認爲它可以工作是寫下面的模板功能的能力

template <typename T, size_t size> 
function(T(&table)[size]){ 
    //do stuff connected with table of type T and size size. 
} 

我知道我能做到這一點沒有這個奇特的魔法在這裏,但我只是想知道,爲什麼這是行不通的。

所以我的問題是:有沒有辦法做我想做的事情,有沒有更優雅的方式做上述工作?

PS:我沒有聲明T類型的原始表,如:T tab[size],因爲我無法創建元素,沒有構造函數,沒有 參數。

+0

也許如果您使用標準術語「數組」而不是「表」,人們會更容易理解您。 –

+0

「我無法創建元素,沒有參數的地方沒有構造函數。」 'std「:: array'處理這個就好了,不需要使用'char'緩衝區。 –

+0

是的,但是我不能使用C++ 11,我不知道std :: array是如何實現的 – DawidPi

回答

2

演員並沒有真正幫助您:

char tab[sizeof(T)*size]; 
T tabT[size] = reinterpret_cast<T(&)[size]>(tab); 

由於陣列的複製,這個代碼實例化時不會編譯。至少,你需要使用

T (&tabT)[size] = reinterpret_cast<T(&)[Size]>(tab); 

不過,我建議你不要存放未初始化的元素char陣列開始。只需使用嵌套陣列的union

template <typename T, int Size> 
class array 
{ 
    union Data { 
     Data() {} 
     T values[Size]; 
    } data; 
public: 
    array() { /* initialize the elements appropriately */ } 
    ~array() { /* destroy the initialized elements */ } 
    // ... 
}; 
+0

謝謝。我不完全理解union在這種情況下如何幫助我,要創建Data的實例,那麼'T values [Size]'將需要以任何方式創建,所以有什麼竅門? – DawidPi

+0

@DawidPi:編譯器贏得' t構造'values'中的元素,你需要使用新的位置創建它們(顯然,以後手動調用析構函數) –

+0

好吧,我剛剛檢查過它,它非常酷,謝謝:) – DawidPi