c++ - 如何构建模板的显式实例化以提高编译速度?

标签 c++ templates explicit-instantiation

我特别询问文件结构以及在哪里放置什么。考虑以下内容(这是我当前结构的一个示例):

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/

相关文章:

c++ - 函数模板的实例化

c++ - 用于移动开发和机顶盒应用的嵌入式 Linux

c++ - 如何检查并发程序的进度保证?

c++ - 如何覆盖 C++ 中的函数

c++ - C++代码中 `???-`是什么意思?

c++ - 可变长度初始值设定项的模板

c++ - CRTP和模板模板?

c++ - 为什么 C++ const 引用可以折叠成非常量引用

c++ - 如何在 C++ 中显式实例化模板 constexpr 变量?

c++ - 类模板的显式实例化而不是实例化构造函数