왜 당신은 단지 사용할 수있는 기능을 포함하는 간단한 클래스로 버퍼를 래핑하지 않아도됩니다. 포인터가 반복자라는 사실을 이용하면이 정도면 충분할 것입니다.
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());
당신은 또한 버퍼가 당신은 destrtuctor을 추가하고 기본 복사를 제거해야 다음에 포함 된 메모리를 관리하려면 생성자 및 대입 연산자
어쩌면 당신은 그것을 알지 못 하겠지만 포인터는 반복자입니다. –
C API에 버퍼를 제공하여 기입합니까, 아니면 메모리를 할당하여 반환합니까? – jcoder
@ JohnB 메모리를 할당하고 다시 릴리스하도록 알리는 함수를 제공합니다. – Baz