Автоматическая генерация шаблонов во время компиляции в C ++ - PullRequest
1 голос
/ 12 октября 2011

У меня есть класс с именем DynamicTexture, который принимает width и height текстуры в качестве параметров шаблона. Параметры используются для создания таблицы фиксированного размера (которая также является классом шаблона).

В моем случае я создаю экземпляр DynamicTexture для различных степеней ширины / высоты (2x2, 4x4, 8x8, 16x16, 32x32 и т. Д. Вплоть до 4096x4096). Это значит, что у меня много таких объявлений:

DynamicTexture<2, 2>       dTexture2;
DynamicTexture<4, 4>       dTexture4;
...
DynamicTexture<4096, 4096> dTexture4096;

Теперь вопрос в том, можно ли как-нибудь автоматизировать этот процесс? Кроме того, я выбираю приблизительную dTexture, запрашивая переменную типа unsigned int (которая показывает текущий размер, выбранный пользователем) и затем отображая текстуру:

if (currTexSize == 2) dTexture2->show();
else if (currTexSize == 4) dTexture4->show();
...
else { dTexture4096->show(); }

Опять же, есть ли способ избежать длинного списка операторов if?

ПРИМЕЧАНИЕ: Я не уверен, как сформулировать заголовок для этого конкретного вопроса. Не стесняйтесь перефразировать это.

Ответы [ 2 ]

7 голосов
/ 12 октября 2011

Теперь вопрос в том, можно ли как-нибудь автоматизировать этот процесс?

Вы можете сделать это с помощью некоторых продвинутых приемов метапрограммирования:

template< int Width, int Height >
struct textures_holder
    : textures_holder< Width * 2, Height * 2 >
{
    typedef textures_holder< Width * 2, Height * 2 > base_t;

    void show( int currTexSize ) const
    {
        if( currTexSize == Width ) // or is it == Height?
            _texture->show();
        else
            base_t::show( currTexSize );
    }

    DynamicTexture< Width, Height > _texture;
};

template<>
struct textures_holder< 4096, 4096 >
{
    void show( int currTexSize ) const
    {
        _texture->show();
    }
};

, тогда вы создадитеобъект типа textures_holder< 1, 1 > и получить переменную для каждой степени 2 измерения до 4096.

0 голосов
/ 12 октября 2011

Вы можете использовать логарифм base-two currTexSize для индексации в массив различных объектов текстуры, при условии, что их метод show является виртуальным и является производным от общего базового класса.Это будет медленнее, но я думаю, что улучшенная читаемость превзойдет потерю производительности.

Что касается автоматического объявления переменных с независимыми именами, для этого не существует реального шаблонного решения.

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