C++将原始表强制转换为另一种表类型

C++ cast raw table to another table type

本文关键字:另一种 类型 转换 原始 C++      更新时间:2023-10-16

我想写一个类似于C++11中的std::array的类。为了做到这一点,我在这个类中声明一个char类型的表,稍后我想调用这个表上的placement new之后,我想把它当作T类型的常规表来使用,但问题来了。

一般可变,如:

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 tab[size]那样声明T类型的原始表,因为我无法创建元素,因为没有构造函数论点。

演员阵容对您没有真正的帮助:

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 */ }
    // ...
};