2016-01-05 46 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