我特别询问文件结构以及在哪里放置什么。考虑以下内容(这是我当前结构的一个示例):
foo.h 由组成:
template <typaname T>
class Foo {
void bar();
}
#include "foo-inl.h"
foo-inl.h 由组成:
template<typaneme T>
void Foo::bar() {
}
一些 baz.cpp 拥有:
#include "foo.h"
Foo<X> foo;
和其他一些 nom_test.cpp 拥有:
#include "foo.h"
Foo<TestY> foo;
如何重组它以利用产品代码(baz.cpp)和测试代码(nom_test.cpp)中的显式实例化。请注意,我不想将测试类型暴露给产品构建。
最佳答案
foo.h :
template <typename T>
class Foo {
void bar();
}
#include "foo-inl.h"
extern template class Foo<X>; // means "Foo<X> is instantiated elsewhere"
foo-impl.cpp :
#include "foo.h"
template class Foo<X>; // instantiates Foo<X> here
baz.cpp :
#include "foo.h"
// can simply use Foo<X>, the impl will be linked from foo-impl.o
同样对于测试版本, foo-impl-test.cpp 将包含:
#include "foo.h"
template class Foo<TestY>;
请记住,虽然显式实例化模板的语义有所不同 - 它们不再是
inline
!由于这个原因,显式实例化模板的用处是有限的。 C++20 模块以一种完全不同且更灵活的方式解决了这个问题,因此可能值得等待。
关于c++ - 如何构建模板的显式实例化以提高编译速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59566362/