c++ “外部模板”成员函数

r1zhe5dt  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(167)

我正在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>一次,让链接器解决这个问题。有没有方法可以对函数和成员函数做类似的事情?

6vl6ewon

6vl6ewon1#

它的工作原理完全一样。
标头中的显式示例化声明:

extern template std::byte* Data::serialize<Object>(const Object&);

以及一个翻译单元中的显式示例化定义:

template std::byte* Data::serialize<Object>(const Object&);

<Object>是可选的,因为它可以从const Object&参数推导出来。)
然而,考虑到这可能会减少编译时间,它也可能会对编译器优化产生负面影响,因为您使内联函数变得更加困难(至少在没有链接时优化的情况下)。无论您是否使用显式示例化,生成的二进制文件将只包含函数模板专门化的一个定义。

相关问题