【发布时间】:2016-10-02 20:15:22
【问题描述】:
我正在尝试创建一个数据结构,它将在连续内存中保存 N 种不同类型。所以在编译时我可以说我想存储 3 种不同类型的 4 个元素,在内存中它看起来像 111122223333。
我一直在使用可变参数模板方法,我认为它会做我想要的,但是我不确定如何在 add 方法中将元素添加到每个数组中。
template<std::size_t N, typename... Args>
class Batch
{
private:
std::tuple<std::array<Args, N>...> data_;
size_t currentPos_;
public:
template<typename T>
void addToArray(std::array<T, N>& array, const T& value)
{
array[currentPos_] = value;
}
void add(const Args&... values)
{
//????
addToArray(/*array, value*/);
currentPos_++;
}
const void* data()
{
&return data_;
}
};
int main()
{
Batched<3, float, double, int> b;
b.add(1.0f, 1.0, 1);
b.add(2.0f, 2.0, 2);
b.add(3.0f, 3.0, 3);
b.add(4.0f, 4.0, 4);
return 0;
}
即使我让它工作,内存布局是否正确?有更好的方法吗?
【问题讨论】:
-
根据 Ildjarn 指出的可能问题修改了我的答案;简而言之:如果
Args...不是 POD 类型,则从不使用我的解决方案 -
关于我为什么提出这个问题以及为什么我接受答案的一些背景信息,即使有警告也是如此。这最终将用于将缓冲区传递给 OpenGL,上面的代码只是一个示例。在实际代码中,我将检查
sizeof类型是否可以被我要传递给 OpenGL 的类型(当前为浮点数)整除,这样可以缓解对齐问题。至于使用std::string之类的东西作为类型的问题,这是有效的,我相信如果我在std::is_trivially_copyable上断言,它应该是安全的。在实践中,不同的类型将是不同大小的向量。
标签: c++ c++11 templates variadic-templates memory-alignment