将仅标头模板库编译到共享库中?

lyt*_*nyn 9 c++ templates shared-libraries

我们正在设计一个新的C++库,并决定采用基于模板的方法以及针对极端情况的一些特定的部分模板特化.特别是,这将是一个仅标题模板库.

现在,有人担心这会导致二进制文件中的大量代码重复,因为这个模板"库"将被编译到任何其他共享库或使用它的可执行文件中(可以说只是那些使用的部分).我仍然认为这不是一个问题(特别是,编译器甚至可以内联它不能跨共享库边界的东西).

但是,既然我们知道将要使用的有限类型的集合, 有没有办法将这个头编译成一个库,并提供一个只有声明而不是其他的不同的头?请注意,库不仅必须包含通用实现,还必须包含部分特化.

Dan*_*ien 6

是.您可以做的是使用编译器的显式模板实例化语法显式实例化CPP文件中的模板.以下是如何在VC++中使用显式实例化:http://msdn.microsoft.com/en-us/library/by56e477(v = VS.100).aspx.G ++有一个类似的功能:http://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html#Template-Instantiation.

请注意,C++ 11引入了显式实例化的标准语法,如[14.7.2] FDIS的显式实例化中所述:

显式实例化的语法是:

显式实例化:

extern选择 template 声明