【发布时间】:2023-03-09 06:51:01
【问题描述】:
我想阻止特定模板类的所有隐式模板实例化,以防止它被实例化到每个翻译单元中。
看来我的选择是:
- 在 gcc 的命令行上使用 -fno-implicit-templates。这 抑制所有隐式模板实例化,这不是我想要的。我只想为单个模板阻止它。
- 使用 C++11“外部模板”。但这只会抑制特定的 显式实例化。我不想输入“外部 每个潜在模板参数的模板”行列出此 模板可能会被实例化。
所以我需要一些介于两者之间的东西。最好有:
extern template class Foo; // suppress all implicit instantiations of Foo
(注意缺少模板参数。)有什么想法吗?
【问题讨论】:
-
用例是什么?您是想完全阻止使用某些实例化,还是只是想节省一些目标文件空间和链接时间?
-
我正在努力节省编译时间。在这种情况下,它有很大的不同。尽管我偶尔可以梳理反汇编以找到任何需要显式外部实例化的新实例,但我更希望链接器在任何新的新隐式实例上出错,以便它们可以立即添加到显式列表中进行因果修改的人的实例化。
-
您可以像拆分非模板一样在头文件和源文件之间拆分模板定义。然后,除非您为源文件中允许的类型集显式实例化模板,否则链接将失败。
-
是的,我知道我遗漏了一些明显的东西。谢谢。另外,如果我需要将显式实例化分布到多个源文件中,我可以将模板实现细节放入一个 .tcc 文件中,该文件会包含在这些源文件中,类似于 gcc 标头的结构方式。