假设我的这个泛型类有一个非类型的模板参数:
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
的值,这只会将问题转移给调用者。
答案 0 :(得分:4)
您可以为该函数编写另一个模板:
template<uint8_t D>
void processSomething(Tile<D> *tile)
{
tile->someMethod();
}
答案 1 :(得分:3)
Tile<0>
是一个与Tile<1>
完全不同的类。你错误地认为不同参数的模板实例化之间存在某种关系。
你知道内部表示没有区别这一事实与编译器无关。如果您想要多态行为,则需要多态类。