非类型模板参数:传递给另一个方法

时间:2018-04-13 08:27:51

标签: c++ templates

假设我的这个泛型类有一个非类型的模板参数:

template<uint8_t D>
class Tile
{
private:
    uint8_t density = D;

public:
    void someMethod()
    {
        if(D == 1)
        { /* do this */ }
        else
        { /* do that */ }
    }
};

根据模板参数D,在对象的方法中采用特定的代码路径。对我来说,这样做的原因是,这使得编译器能够完全优化if语句,因为D永远不会改变。对于外部世界,模板参数D根本不会更改对象的界面 - 无论D具有什么值,对象的界面都保持不变。

现在我想将这样的对象传递给另一个方法,用它做一些事情。我将如何以一般方式做到这一点?

void processSomething(Tile *tile)
{
    tile->someMethod();
}

这当然失败了,因为没有指定模板参数。但是对于Tile的用户,模板参数没有任何区别,它仅适用于内部状态。如何编写processSomething,以便模板参数的值无关紧要?

我发现的唯一解决方案是实现这样的重载:

void processSomething(Tile<0> *tile);
void processSomething(Tile<1> *tile);
...

这是不切实际的。或者让processSomething本身成为模板,但是我必须指定调用processSomething的值,这只会将问题转移给调用者。

2 个答案:

答案 0 :(得分:4)

您可以为该函数编写另一个模板:

template<uint8_t D>
void processSomething(Tile<D> *tile)
{
    tile->someMethod();
}

答案 1 :(得分:3)

Tile<0>是一个与Tile<1>完全不同的类。你错误地认为不同参数的模板实例化之间存在某种关系。

知道内部表示没有区别这一事实与编译器无关。如果您想要多态行为,则需要多态类。