Шаблоны C ++: проходной тип, а не экземпляр? - PullRequest
0 голосов
/ 01 декабря 2011

Шаблоны могут не быть ответом здесь, но я попробовал некоторое наследование, и это не сработало, поэтому здесь я нахожусь.

Проблема:

У меня есть абстрактный базовый классв котором хранятся все мои «рабочие» функции.Затем у меня будет куча других классов, которые расширяют этот базовый класс и, по сути, просто заполняют детали данных для передачи в «рабочие» функции, а также переопределяют пару функций базовых классов.

Одна из основных частей данных, которые будут меняться в каждом производном классе, - это структура.

Итак, мой первоначальный план атаки состоял в том, чтобы определить BaseStruct, а абстрактный базовый класс просто выполнил всю свою работу над этой базовой структурой.Если производные классы используют другую структуру, которая расширяет эту базовую структуру, то это нормально.

Проблема, с которой я столкнулся, заключается в том, что я не могу получить размер структуры, поскольку в рабочей функции типструктура, с которой он работал, - это BaseStruct, а не производный тип.

Так что теперь я смотрю на шаблоны.

По сути, я хочу иметь функцию Base, которая делает это:

template<typename StructType>
void AbstractMaterial::CreateVertexBuffer() {

    StructType* array = new StructType[numVertices];

    size_t si = sizeof(StructType) * numVertices;

    ...
}

Конечно, фактически ничего не передавая в эту функцию, она на самом деле не работает.Я бы предпочел не создавать экземпляр StructType для передачи просто для получения информации о типе, но, похоже, нет другого пути?

По сути, я хочу, чтобы производные классы кому-то указали использовать StructType для использованиякогда эта функция вызывается.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 01 декабря 2011

Вы можете указать тип, написав его между <> перед скобками.Например:

// supposing asm is an AbstractMaterial*
asm->CreateVertexBuffer<SomeType>();
3 голосов
/ 01 декабря 2011

Этот вызов должен работать:

Для классовой (статической) функции:

AbstractMaterial::CreateVertexBuffer<MySpecificStruct>();

Для функции-члена:

instance.CreateVertexBuffer<MySpecificStruct>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...