运行时绑定和模板实例化
Runtime binding and template instantiation
从这里可以看出,并非所有模板函数都在模板类中编译。 标准说,如果未使用方法或成员,则不会对其进行编译。确实很酷的功能!现在,让我们讨论以下层次结构:
class A
{
virtual void f() {};
};
template <typename T>
class B : public A
{
virtual void f () override
{
// do something dangerous
}
}
你永远不会知道B<int>::f
是否被召唤,对吧?原因是您可以使用动态绑定调用B::f
函数,并且您永远不知道A*
指向B
类型对象还是从A
派生的其他类型化对象。那么编译器应该如何处理这种情况呢?
A* ptr = nullptr;
if (i > 0)
{
ptr = new B<int>();
}
ptr->f();
编译器如何猜测/发现这种情况以生成B<int>::f
重要的相关问题:C++类成员函数模板可以是虚拟的吗?
在
程序中的某个地方,您必须使用B<int>
或派生的类型来创建实例。此时,将实例化模板并生成其代码。还有显式实例化。有关详细信息,请查看 cppreference.com。
相关文章:
- 在基于范围的for循环中使用结构化绑定声明
- 使用结构化绑定'Reflection'
- 为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
- 为什么 boost::comb 对结构化绑定的支持缺少结构化绑定机制对 boost::tuples::cons 的适应?
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 在 C++14 中手动实现结构化绑定
- 为什么结构化绑定不支持可变数组?
- 在只读(即 const)访问器上执行结构化绑定的最佳实践是什么?
- 带有 std::minmax 和 rvalues 的结构化绑定
- 在无序映射的结构化绑定中推导类型
- 为什么基于范围的 for 循环中的结构化绑定只是一个副本而不是引用?
- 您自己的类型的结构化绑定,不是结构或元组(通过公共成员函数)
- 结构化绑定:遍历元组的双端面
- 结构化绑定是否适用于 std::vector?
- 结构化绑定,无需复制即可获取子向量的连续元素
- 成员变量的结构化绑定
- 结构化绑定语法是否可以在多态 lambda 中使用
- 结构化绑定的用例是什么?
- C++ 有关unordered_map的结构化绑定问题
- 结构化绑定是否可重用?