在模板中使用基类接口



我应该使用基类作为调用者:

void use(Base& b)
{
int i = b.size();
b.create();
}
void do()
{
Subclass sub{5};
use(sub);
}

但是为什么我不应该使用模板来消除运行时开销:

template<typename T>
void use(T& sub)
{
int i = sub.size();
sub.create();
}
void do()
{
Subclass sub{5};
use(sub);
}

Donot将其用作优化。如果认为合适,编译器可以自行执行去机会化。使用代码中占用的内容。

也就是说,没有什么能阻止你那样做。它可能适用于也可能不适用于您的需求。

例如,如果use是一个虚拟函数,或者是一个需要将对象存储在某个固定类型的地方的函数,则不能使用它的模板版本

如果已经有了虚拟功能,它可能不会有什么好处,因为模板也有自己的缺点。

此外,除非虚拟函数被标记为final,否则它不一定会删除虚拟调用。这是因为另一个类可能继承自您正在发送的类,并且必须从虚拟表中调用函数。

最新更新