Как обойти структуры, содержащие либо указатели, либо статические массивы - PullRequest
0 голосов
/ 21 мая 2018

Я передаю структуры, содержащие буферы вершин openGL и данные, для удобства функций, которые связывают и обновляют дату на GPU.Прямо сейчас у меня есть следующее:

struct VertexBufferData {
    VertexBuffer vbo;
    ElementBuffer ebo;
    size_t    v_cap;
    size_t    v_count;
    size_t    i_cap;
    size_t    i_count;
    GLfloat*  vertices; // dynamically allocated
    GLuint*   indices; // dynamically allocated
};

И все же иногда я знаю размеры некоторых вершин и буферов индексов во время компиляции, и в этом случае я хотел бы сделать это:

struct VertexBufferData {
    VertexBuffer  vbo;
    ElementBuffer ebo;
    size_t    v_cap;
    size_t    v_count;
    size_t    i_cap;
    size_t    i_count;
    GLfloat   vertices[SOME_CONST_SIZE_1];
    GLuint    indices[SOME_CONST_SIZE_2];
};

Структуры практически идентичны, но статические массивы и указатель / динамически распределенная память различны и требуют разных типов, что означает, что мне нужно будет дублировать много кода (функций и других структур, например, void gl_bind_buffers_and_upload_data(VertexBufferData* vbd, GLenum usage) ) только для поддержкиобе версии структуры.

Есть ли способ рассмотреть обе структуры как один и тот же тип или элегантный обходной путь без переключения на наследование C ++ (которого я пытаюсь избежать) .Я хотел бы сохранить данные как POD.Параметризация шаблона не решает проблему, но может ли быть другой легкий способ решения проблемы в C ++?(Я бы хотел использовать функции, которые не используют виртуальные функции).

Моей первой мыслью было бы создать какую-то сущность-обертку, но это звучит слишком сложно.Должен ли я просто согласиться с дублированием кода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...