我知道您不能将虚拟方法声明为模板,因为编译器不知道要在虚拟表中保留多少条目。然而,这是一个技术限制,而不是语言限制。编译器可以知道实际需要多少模板实例,并“返回”以分配适当的 vtable 大小。
即将发布的标准中是否有计划的技术解决方案?
编译器永远无法知道模板的所有可能实例化。在目前的编译模式下,每个翻译单元都是单独编译后链接的。在一个翻译单元中编译模板类型时,您不知道该类型在另一个翻译单元中的实例化。
想象一下,您正在编写一个库,并且想要在其中包含一个模板函数。您编译该库,然后将其分发给您的客户。现在客户可以使用他们喜欢的任何模板参数来实例化您的模板函数,但是您的库已经编译好了!它不能“返回”并改变这一点。
您假设在编译模板函数时,您还可以使用该函数的每个实例化。通常情况并非如此,并且在当前的编译和链接模型下,不可能知道是这种情况。
鉴于不需要使用现有链接器,这当然是可能的。也就是说,链接器可以筛选该模板函数的所有实例并构建适当的数据结构。但是 C++ 的优势之一是它不需要专门的链接器。这使得它可以移植到链接器是用石头编写并且无法更改的系统。而且,是的,这种情况发生了;链接器是所有目标代码相遇的地方,它必须与系统支持的所有编程语言兼容,这反过来意味着它有时会变得陈旧和笨拙,并且任何变化带来了很大的破损风险。所以,虽然理论上可以做到这一点,但它不会发生。