我正在class
中处理template
函数:
class Data {
public:
template <typename T>
std::byte* serialize(const T& object) { /* serialize */ }
};
我注意到Data::serialize<Object>
是在 every 编译单元中示例化的。
extern template class Class<Object>;
在头文件中并放置
template class Class<Object>
只示例化Class<Object>
一次,让链接器解决这个问题。有没有方法可以对函数和成员函数做类似的事情?
1条答案
按热度按时间6vl6ewon1#
它的工作原理完全一样。
标头中的显式示例化声明:
以及一个翻译单元中的显式示例化定义:
(
<Object>
是可选的,因为它可以从const Object&
参数推导出来。)然而,考虑到这可能会减少编译时间,它也可能会对编译器优化产生负面影响,因为您使内联函数变得更加困难(至少在没有链接时优化的情况下)。无论您是否使用显式示例化,生成的二进制文件将只包含函数模板专门化的一个定义。