1

我想要一个具有内联数组(不是指向另一个数组的指针)成员的类,它可以具有在创建类期间指定的不同大小。就像是:

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

有一个更好的方法吗?

4

3 回答 3

2

这是一种完全可以接受的方式来做你想做的事。如果您在编译时知道所需的大小,则模板参数是一个好方法。它符合标准,不涉及任何诡计。你还能想要什么?

查看std:array标准库中使用的这种方法。

于 2013-11-06T08:30:15.193 回答
0
template<typename T>
class Buffer {

    Buffer(std::size_t size) : events_(new T[size]) {}
    ~Buffer() { delete[] events_; }

private:
    T* events_;
}

是您在不使用允许 C++ 中的 C99 VLA 的特定于编译器的扩展的情况下能够获得的最接近的结果。在标准 C++ 中,数组大小在编译时是固定的,就是这样——如果你想在运行时决定大小,你必须使用堆分配。

当然,用std::vector<T>一个漂亮的 API 来包装堆分配比滚动你自己的要好得多:-)

于 2013-11-06T08:23:40.673 回答
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 类型,那么您需要确保它们也已初始化。

于 2013-11-06T08:27:58.943 回答