库使用的模板实例化

Posted

技术标签:

【中文标题】库使用的模板实例化【英文标题】:Template Instantiation for Library Use 【发布时间】:2011-03-18 17:12:25 【问题描述】:

我正在用 C++(0x) 构建一个严重依赖模板的图像处理库,我担心这些模板会对用户的编译时间产生影响。例如,我已经将我的图像类定义为 ns::Image,并且我有几种像素类型,例如 ns::PixRGB、ns::PixRGBA、ns::PixHSV 等...

我还会很多图像处理功能,例如

template<class T, class S>
  void ns::drawCircle(ns::Image<T> & img, S color, ns::Circle);

现在,我知道 95% 的用户只想调用 ns::drawCircle&lt;PixRGB&lt;byte&gt;, PixRGB&lt;byte&gt;&gt;(...),所以我想显式地实例化这些类型函数的 一些 组合,同时仍然允许编译器自定义编译我没有指定的任何东西。这样做可以让我保持共享库的编译速度和仅头文件库的灵活性。

这种事情可能吗?如果可能,语法是什么?

【问题讨论】:

【参考方案1】:

这称为显式实例化。在头文件中,在 ns::drawCircle&lt;T,S&gt; 函数模板被定义之后的某处:

namespace ns 
    extern template void drawCircle<>(
        Image<PixRGB<byte> >& img, PixRGB<byte> color, Circle);

在库中的 *​​.cpp 文件中:

namespace ns 
    template void drawCircle<>(
        Image<PixRGB<byte> >& img, PixRGB<byte> color, Circle);

【讨论】:

以上是关于库使用的模板实例化的主要内容,如果未能解决你的问题,请参考以下文章

如何制作可在不同代码库中重用的C“库”?

库使用的模板实例化

共享库符号查找模板实例化

在使用 g++ 创建的共享库中隐藏实例化模板

子类化库中的私有类

无法强制实例化专用模板