【问题标题】:Use base class interface in templates在模板中使用基类接口
【发布时间】:2020-10-07 14:14:42
【问题描述】:

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

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);
}

【问题讨论】:

    标签: c++ templates inheritance


    【解决方案1】:

    不要不要将此作为优化。如果认为合适,编译器可以自行执行去虚拟化。使用代码中适当的内容。

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

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

    如果周围已经有虚函数,它可能没有什么好处,因为模板有自己的缺点。

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

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2016-04-14
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多