防止C样式阵列指针的升级
Preventing upcasts for C style array pointers
struct Entry
{
int Data0;
};
struct ExtendedEntry : public Entry
{
int Data1;
};
我有一种简单的方法,可以期待C-Style数组指向进入这样的条目
void Calculate(Entry* data, int count);
将指针传递到一系列扩展程序时,这种方法显然会失败。如何防止用户这样做?
ExtendedEntry items[50];
// [...]
Calculate(items, 50);
不是我追求防弹的API,我只想防止我和我的同事再次犯同样的错误。
制作一个简单的包装器:
template <typename TEntry>
void CalculateSafe(TEntry* data, int count)
{
static_assert(sizeof(TEntry) == sizeof(Entry), "size mismatch");
Calculate(data, count);
}
,只要它具有相同的尺寸,就可以通过任何派生类型,这将解决您在CAPI需要在数组中进行指针算术时所面临的问题。
@john zwinck的解决方案非常好!
然而,还有另一种方法。您可以定义这样的方法:
template < class T >
void Calculate(T * arr, int count)
{
static_assert(std::is_base_of<Entry, T>::value, "true");
for (int i = 0; i < count; i++)
std::cout << arr[i].Data0 << std::endl;
}
虽然模板确保实现的正确性,但static_assert保证您仅使用预定义的类型调用此方法。
,或者您可以声明已删除的过载:
template<class T,std::size_t N>
std::enable_if_t<!std::is_same_v<T,Entry>>
Calculate(const T(&)[N],int)
= delete;
您也可以通过类型大小比较替换类型的比较。
相关文章:
- EIGEN地图类:将C阵列映射到VectorXD指针以有效的方式
- 通过从当地的C风格阵列中返回指针来获取一个悬空的指针
- 将C 中的每个指针删除作为阵列的指针安全吗?
- 重新分配指针阵列的一部分的安全方法
- 排序阵列会使指针链接错误
- 指针阵列在一个对象数组中函数
- 指针阵列打印值
- C 在指针阵列中删除第一个元素,以效应后来的元素
- 问题将信息复制到指针阵列中
- 从指针打印动态int阵列中获取怪异的字符
- 将指针或一系列指针存储在动态阵列中
- 删除指向排序的字符串阵列的指针会在运行后会有一个错误
- 排序浮动指针阵列
- 快速将双重指针阵列转换为单个指针,可能是连续的
- C 按顺序排列一个指针阵列
- 如何使用struct构造函数在结构中初始化指针阵列
- 带有超载运算符的指针阵列
- 指针阵列和指针数组的指针之间的区别
- 创建类型结构的指针阵列
- 指针阵列的动态初始化