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 <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ます。

Buffer2 段階のオブジェクト作成プロセスと、動的に割り当てなければならないという事実のために、これは醜いです。でも、ご要望にお応えできるのが一番だと思います。またT、非 POD タイプの場合は、それらも初期化されていることを確認する必要があります。

于 2013-11-06T08:27:58.943 に答える
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 に答える