使用できるようにしたい関数を含む単純なクラスでバッファをラップしないでください。ポインタがイテレータであるという事実を利用して、おそらくこのようなもので十分でしょう。
template<typename T>
struct RawBuffer<T>
{
RawBuffer( T* in_buffer, size_t in_n ) : buffer(in_buffer), n(in_n) {}
T* buffer;
size_t n;
T* begin() { return buffer; }
T* end() { return buffer+n; }
const T* begin() const { return buffer; }
cont T* end() const { return buffer+n; }
T& operator[](size_t i) { return buffer[i]; }
const T& operator[](size_t i) const { return buffer[i]; }
};
これで、ベクターのように使用できます。
RawBuffer<MyObject> values( generate_objects(n), n );
//Set an entry
values[1] = MyObject()
//Or use an entry
values[1].do_something();
//Lets use some std functions on the object.
std::for_each( values.begin(), values.end(), my_object_fn );
//Or create a real vector from it
std::vector<MyObject> values_copy( values.begin(), values.end() );
バッファに含まれるメモリも管理したい場合は、デストラクタを追加し、デフォルトのコピー コンストラクタと代入演算子を削除する必要があります。