我想要一个带有内联数组(不是指向另一个数组的指针)成员的类,它可以是在创建类时指定的不同大小。类似的东西:
template<typename T>
class Buffer {
...
...
private:
T events_[size]; // This size should be determined during compilation time.
}
我可以使用这样的东西:
template<typename T, int size>
class Buffer {
...
...
private:
T events_[size]; // This size is determined during compilation time.
}
有更好的方法吗?
答案 0 :(得分:2)
这是完全可以接受的方式来做你想要的。如果您在编译时知道所需的大小,那么模板参数是一种很好的方法。它符合标准,不涉及任何欺骗。你还想要什么?
查看std:array
以查看标准库中使用的此方法。
答案 1 :(得分:0)
template<typename T>
class Buffer {
Buffer(std::size_t size) : events_(new T[size]) {}
~Buffer() { delete[] events_; }
private:
T* events_;
}
是最接近你能够在不使用C ++ VBA的情况下使用特定于编译器的扩展而获得的。在标准C ++中,数组大小在编译时是固定的,就是这样 - 如果你想在运行时决定大小,你必须使用堆分配。
当然,使用std::vector<T>
将堆分配包装在一个漂亮的API中是一个比滚动自己更好的想法: - )
答案 2 :(得分:0)
似乎您的要求是拥有动态尺寸的“扁平”物体。
我会做这样的事情
template <class T>
class Buffer
{
public:
Buffer(size_t size) : size_(size) {}
...
private:
size_t size_;
const T* events() const { return reinterpret_cast<const T*>(this + 1); }
T* events() { return reinterpret_cast<T*>(this + 1); }
};
Buffer<int>* buf = new char[sizeof(Buffer<int>) + n*sizeof(int)];
new (buf) Buffer<int>(n);
events
方法可用于访问事件,这些事件刚好在Buffer
对象的末尾。
由于两步对象创建过程以及Buffer
必须动态分配的事实,这很难看。但我认为这是满足您要求的最佳方法。此外,如果T
是非POD类型,那么您需要确保它们也已初始化。