我正在使用OpenGL处理渲染器。
我有头等舱,几何:
class Geometry
{
public:
void setIndices( const unsigned int* indices, int indicesCount );
private:
std::vector<unsigned char> colors;
std::vector<float> positions;
std::vector<unsigned int> indices;
};
有时,我的几何图形需要为不同类型的索引存储,数据可以是:
1. std::vector<unsigned char>
2. std::vector<short>
3. std::vector<int>
// I've already think about std::vector<void>, but it sound dirty :/.
目前,我在任何地方使用 unsigned int ,当我想将其设置为几何体时,我会投射数据:
const char* indices = { 0, 1, 2, 3 };
geometry.setIndices( (const unsigned int*) indices, 4 );
后来,我想在运行期间更新或读取这个数组(有时候数组可以存储超过60000个索引),所以我做了类似的事情:
std::vector<unsigned int>* indices = geometry.getIndices();
indices->resize(newIndicesCount);
std::vector<unsigned int>::iterator it = indices->begin();
问题是我的迭代器循环在 unsigned int 数组上,所以迭代器转到4个字节到4个字节,我的初始数据可以是char(所以1个字节到1个字节)。无法读取我的初始数据或使用新数据更新它。
当我想要更新我的向量时,我唯一的解决方案是创建一个新数组,用数据填充它,然后将它转换为无符号的int数组,我想迭代我的索引指针。
谢谢你的时间!
答案 0 :(得分:2)
转换为错误的指针类型会产生未定义的行为,如果此类型的大小错误,肯定会失败。
我如何做一些通用的东西(使用unsigned int,char和short)?
模板将是制作该通用的最简单方法:
template <typename InputIterator>
void setIndices(InputIterator begin, InputIterator end) {
indices.assign(begin, end);
}
用法(更正示例以使用数组而不是指针):
const char indices[] = { 0, 1, 2, 3 };
geometry.setIndices(std::begin(indices), std::end(indices));
您可能会考虑直接获取容器,数组和其他范围类型的方便过载:
template <typename Range>
void setIndices(Range const & range) {
setIndices(std::begin(range), std::end(range));
}
const char indices[] = { 0, 1, 2, 3 };
geometry.setIndices(indices);
如何在没有复制的情况下迭代数组?
如果不复制数据,则无法更改数组的类型。为避免副本,您必须期望正确的数组类型。