建议使用动态大小的内联数组成员的方法是什么?

时间:2013-11-06 08:12:56

标签: c++ arrays pointers

我想要一个带有内联数组(不是指向另一个数组的指针)成员的类,它可以是在创建类时指定的不同大小。类似的东西:

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.
}

有更好的方法吗?

3 个答案:

答案 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类型,那么您需要确保它们也已初始化。