C++将原始表强制转换为另一种表类型
C++ cast raw table to another table type
我想写一个类似于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 */ }
// ...
};
相关文章:
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- void* 数组将元素转换为另一种类型
- 在 c++ 中将一种结构类型分配给另一种类型
- 将空基类优化对象强制转换为另一种类型是否会破坏严格的别名?
- 将 32 位浮点数和不强制转换的 32 位整数与双精度进行比较,当其中一个值可能太大而无法完全适合另一种类型时
- 何时与另一种类型兼容
- C 模板可以匹配(仅)一种类型的列表或另一种类型的列表
- 是否可以将一种类型的数组转换为大小不同的另一种类型的数组?
- 在比较中使用已强制转换为另一种类型的函数指针是否定义良好?
- 多态变体,并将一种类型的引用绑定到另一种类型的引用
- 如何使用模板元编程在 C++17 中将一种类型转换为另一种类型
- 将字符阵列施放到另一种类型中是否违反了严格的确定规则
- 创建一个从一种类型到另一种类型的别名
- 如何使一种类型的STL对只占用另一种类型的空间"empty struct"?
- c++如何打印另一种类型的变量的String属性的值
- 将"this"指针强制转换为另一种类型不违反严格锯齿?
- 使用模板将语义从一种类型移动到另一种类型
- 将所有 int 类型更改为另一种类型,使用 #define 用于大型程序
- C++传递与另一种类型相同的类型
- C++ 为什么我们需要从一种类型显式转换为另一种类型