模板化虚拟功能是不可能的。只是暂时的技术限制?

时间:2013-03-27 12:07:34

标签: c++ templates

据我所知,您不能将虚方法声明为模板化,因为编译器不知道要在虚拟表中保留多少条目。然而,这是技术限制,而不是语言限制。编译器可以知道实际需要多少个模板实例,并“返回”以分配适当的vtable大小。

即将推出的标准中是否有计划的技术解决方案?

3 个答案:

答案 0 :(得分:4)

编译器永远不会知道模板的所有可能的实例化。在当前的编译模型下,每个翻译单元分别编译并稍后链接。在一个翻译单元中编译模板类型时,您不知道该类型在另一个翻译单元中的实例化。

想象一下,你正在编写一个库,并且你想要一个模板函数。您编译库然后将其分发给您的客户端。现在,客户端可以使用他们喜欢的任何模板参数来实例化模板函数,但是您的库已经被编译了!它不能“回去”并改变它。

您假设在编译模板函数时,您还可以使用该函数的每个实例。通常情况并非如此,在目前的编制和链接模型下,不可能知道情况。

答案 1 :(得分:3)

这样做肯定是可能,因为没有使用现有链接器的要求。也就是说,链接器可以筛选该模板函数的所有实例化并构建适当的数据结构。但是C ++的优点之一是它不需要专门的链接器;这使得它可以移植到链接器写在石头上并且无法更改的系统。而且,是的,这种情况发生了;链接器是目标代码遇到的 all 的地方,它必须与系统支持的所有编程语言兼容,反过来,这意味着有时它已经变得陈旧和苛刻,任何变化都会带来很大的破损风险。因此,虽然理论上可以做到这一点,但它不会发生。

答案 2 :(得分:1)

目前没有基于C ++标准委员会paperscore language issues的计划。 C ++标准规定了C ++实现的要求,但没有定义技术实现本身。因此,模板虚函数显然不是技术限制,而是对标准定义的语言的限制。然而,语言的限制可能是由于实施技术限制而改变现有实施所涉及的风险所致。