减少模板标题的大小

时间:2016-05-05 03:31:43

标签: c++ templates

我正在开发一个大量使用模板的C ++库。对于大多数类,所有代码都驻留在某个.hpp文件中,该文件将由客户端代码直接#include。我有两件事需要担心:

  1. 是否有一些设计模式可以将实施代码移动到"背景"?当我设计非模板类时,我经常将"界面"类和实现类,前者将通过执行类似getImpl()->foo()的操作委托后者,以便可以动态链接实现代码。我不确定如何为模板执行此操作。 我认为可能动态链接对模板没有意义吗?

  2. 大模板标题(> 1000行)是否常见?还是那么糟糕?如果不好,我该怎么办呢?

  3. 我知道这个问题How to reduce output size of template-heavy C++ code?,但我认为我们正在询问不同的事情:该问题的OP试图减少输出的大小,而我试图减少我的库标题本身的大小。

    更新:例如,如果您要设计std::vector,您将如何组织其界面&实施(如果需要)?

1 个答案:

答案 0 :(得分:0)

不要过分担心标题大小。模板几乎总是将所有代码都放在标题中,因为每个客户端必须知道在创建全新版本(使用不同的模板参数)时如何实例化类。

如果您担心1000行,请查看矢量。在Visual Studio 2013中,它是3000行。

话虽如此,你真的只需要在任何地方提供类的声明和定义一次,就像任何普通的类一样。因此,可以使用没有实现的模板头,然后使用实现创建.cpp。这个.cpp必须强制生成你需要的所有模板类型。

在下面的示例中,B.cpp的作者必须知道将要使用的所有模板参数。您不需要这么多文件,但我认为这应涵盖所有情况。

B.h:

template<class T>
struct B
{
    B();
};

B_impl.h:

#include "B.h"
template<class T>
B<T>::B() {}

B.cpp:

#include "B_impl.h"
template struct B<int>;
template struct B<short>;

main.cpp中:

#include "B.h"
B<int> b;