在C ++编译时自动生成模板类

时间:2011-10-12 19:47:57

标签: c++ templates

我有一个名为DynamicTexture的课程,它将纹理的widthheight作为模板参数。这些参数用于实例化固定大小的表(也是模板类)。

就我而言,我正在为两个宽度/高度的各种功率实例化DynamicTexture(所以2x2,4x4,8x8,16x16,32x32等一直到4096x4096)。这意味着我有很多这样的声明:

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

现在问题是,我可以以某种方式自动化该过程吗?此外,我通过查询类型为unsigned int的变量(显示用户选择的当前大小)然后显示纹理来选择近似dTexture:

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

再次,有什么方法可以避免if语句的长列表?

注意:我不确定如何标出此特定问题的标题。随意重新说出来。

2 个答案:

答案 0 :(得分:7)

  

现在问题是,我可以以某种方式自动化该过程吗?

你可以用一些先进的元编程技巧来做到这一点:

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个。

答案 1 :(得分:0)

如果currTexSize方法是虚拟的并且从公共基类派生,则可以使用show的基数为2的对数来索引不同纹理对象的数组。这将会变慢,但我认为可读性的提高将超过性能损失。

至于自动声明独立命名的变量,没有真正的模板解决方案。