Предложения по возвращению памяти из класса

У меня есть класс, который должен хранить данные пикселей (плавающие для позиции, плавающие для цвета). Я пытаюсь использовать стиль C ++ в элементах данных (данные хранятся в std::array<float, N> вместо простых массивов C). В классе есть другие методы получения, установки и функции, предназначенные для того, чтобы быть «помощниками» для заполнения этих полей.

Теперь мне нужно создать буфер данных вершины OpenGL, куда я должен записать

  4 floats for xyzw
4 floats for rgba
2 floats for UV coords

в этом порядке. Мне интересно, как я должен это сделать .. Я пытался сделать

class MyVertexData {
std::array<float, 4> pos;
std::array<float, 4> rgba;
std::array<float, 2> uv;
public:
void writeData(float *ptrToMemory) {
if(ptrToMemory == nullptr)
throw std::runtime_exception("Null pointer");

std::array<float, 10> output;

output= {
pos[0], pos[1], pos[2], pos[3],
rgba[0], rgba[1], rgba[2], rgba[3],
uv[0], uv[1]
};

memcpy(memory, out.data(), 10 * sizeof(float));
}
};// Caller code
std::vector<float[10]> buffer(4);
vertex0.writeElements(buffer[0]);
vertex1.writeElements(buffer[1]);
vertex2.writeElements(buffer[2]);
vertex3.writeElements(buffer[3]);

но у этого подхода есть две проблемы:

  1. Мне нужно доверять вызывающей стороне, чтобы выделить память для хранения 10 поплавков
  2. Нет подписи C ++ 11 +, я просто получаю указатель с плавающей точкой

Я не могу просто вернуть std::unique_ptr так как мне нужна непрерывная область памяти (buffer) где элементы должны храниться, но мне также необходимо различать различные элементы (что также сделает код более читабельным).

Было бы неплохо вернуть умный указатель или что-то подобное, чью память я могу легко «объединить» с другими элементами, чтобы я мог безопасно передать этот материал в OpenGL.

2

Решение

CppCoreGuidelines вводит span который является Посмотреть смежного элемента, так что вы можете использовать что-то вроде:

void writeData(gsl::span<float, 10> ptrToMemory)

выразить намерение.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]