gpt4 book ai didi

c++ - 如何在源文件中对模板功能进行特化处理?

转载 作者:行者123 更新时间:2023-12-02 10:04:46 25 4
gpt4 key购买 nike

在开发引擎时,我们遇到了这个问题。我们想要

template <typename T>
std::pair<const uint8_t*, size_t> get_resource()
{
return {nullptr, 0ull};
}

并且专门用于许多 T。重要的是,我们希望特化工作在单独的源( .cpp)文件中,并编译到引擎的静态库二进制文件中。在源文件中放置专门知识至关重要,因为引擎的巨大代码库(至少几十万个LoC)的其他 header 可能会经常更改这些函数并 #include d。因此,如果它们驻留在头文件中,则可能会在更改一种专业的定义之一时导致重建项目的很大一部分。我找不到此类问题的帮助,因此在此发布我们的解决方案。

最佳答案

首先:将功能模板特化放置在源文件中没有问题,因为-在进行专门化时-它与其他功能一样。棘手的是,让源#include用模板定义定义该 header 存在的 header 。显然,c++中没有办法声明特殊化。您可以执行的操作是为某些get_resource强制实例化T模板(显然,无论如何我们都需要这样做,因为我们希望将特殊化功能编译成二进制库)。可以使用以下语法完成此操作:

//force instantiation of get_resource for T=SOME_TYPE
template std::pair<const uint8_t*, size_t> get_resource<SOME_TYPE>();

但是:如果我们将其放置在头文件中,则在模板定义之后,我们希望能够对其进行专门化处理,因为您无法对已经实例化的内容进行专门处理。如果我们将其放在源文件中,则在专门化之后,带有模板定义的 header 的 #include源将无法看到它,因为它从未声明过存在。这就是 extern template抢救的时刻。使用额外的 extern关键字强制实例化是一种声明,该模板函数将针对某些给定的 T(在上面的示例中为 SOME_TYPE)实例化,但尚未声明。因此,我们现在可以做的就是使用此 extern关键字在头文件中声明强制实例化,然后在源文件中定义我们的专长,并在之后定义实际的强制实例化(不使用 extern)。这样可以确保专化对于通过 #include对其进行编码的源是可见的,同时可以将其定义放置在源文件中(作为单独的翻译单元进行编译)。

TL; DR

头文件
template <typename T>
std::pair<const uint8_t*, size_t> get_resource()
{
return {nullptr, 0ull};
}

extern template std::pair<const uint8_t*, size_t> get_resource<SOME_TYPE>();

源文件
template<> std::pair<const uint8_t*, size_t> get_resource<SOME_TYPE>()
{
return {reinterpret_cast<const uint8_t*>("whatever"), 9ull};
}

template std::pair<const uint8_t*, size_t> get_resource<SOME_TYPE>();

关于c++ - 如何在源文件中对模板功能进行特化处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60780043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com