繁体   English   中英

标准库非类型模板类是否显式实例化?

[英]Are standard library non-type template classes explicitly instantiated?

当我们有一个具有非类型模板参数的模板化 class(或函数)时,编译器如何生成版本? 当然,它不会为N的每个可能值创建一个版本

假设像std::array<T,N>这样的东西?

我正在尝试使用 size_t 模板参数编写自己的模板化 function,并且我试图弄清楚是否/如何需要显式实例化我将使用的版本

(我已将程序拆分为不同的翻译单元)

我有一个模板化的 function 类似于

template <size_t N>
std::bitset<N> f(std::bitset<N> A){}

我将声明放入 header 文件并将定义放入 a.cpp 文件。 它不会生成正确的版本。 所以我试图明确地实例化它

template std::bitset<10> f<10>(std::bitset<10> A);

但我收到“错误:显式实例化....但没有可用定义”的错误

标准库和您都不需要显式实例化任何模板特化,无论它是否具有非类型模板参数。

如果被实例化的实体的定义可用,则用户以需要存在专门化定义的方式使用的模板的任何专门化将导致它自动被隐式实例化。 通常应始终满足该条件,因为将模板化实体的定义连同它们的初始声明一起放入 header 文件是标准做法,以便在使用它们的所有翻译单元中都可以访问它们。

因此std::array<T,N>将为翻译单元实际使用的所有类型T和值N对隐式实例化。

需要显式实例化的唯一情况是,如果您打算将模板成员的定义分离到单个翻译单元而不是 header 文件中,在该文件中它们可用于所有翻译单元以隐式实例化。 但是,如果您知道模板参数的所有可能值,则只能首先执行此操作,然后您需要显式实例化所有这些值,这对于大多数非类型模板参数是不可行的。

除了显式实例化之外,还可以通过避免在每个使用它们的翻译单元中隐式实例化模板特化来优化编译时间。 这仅对您知道将经常使用的专业化有意义。 例如,一些标准库实现将其应用于std::string ,这是专门化std::basic_string<char> 将它应用于例如std::array并没有任何意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM