1

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

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)中的显式实例化。请注意,我不想将测试类型暴露给产品构建。

4

1 回答 1

0

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 模块以一种完全不同且更灵活的方式解决了这个问题,因此可能值得等待。

于 2020-01-02T20:45:21.413 回答