1

我正在使用 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();

问题是我的迭代器在一个无符号整数数组上循环,所以迭代器转到 4 个字节到 4 个字节,我的初始数据可以是 char(所以 1 个字节到 1 个字节)。无法读取我的初始数据或用新数据更新它。

当我想更新我的向量时,我唯一的解决方案是创建一个新数组,用数据填充它,然后将其转换为一个无符号整数数组,我想迭代我的索引指针。

  1. 我怎样才能做一些通用的事情(使用 unsigned int、char 和 short)?
  2. 如何在不复制的情况下遍历数组?

谢谢你的时间!

4

1 回答 1

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);

如何在不复制的情况下遍历数组?

不复制数据就无法更改数组的类型。为避免复制,您必须期待正确的数组类型。

于 2013-10-08T15:21:32.260 回答