我正在开发一个大量使用模板的C ++库。对于大多数类,所有代码都驻留在某个.hpp
文件中,该文件将由客户端代码直接#include
。我有两件事需要担心:
是否有一些设计模式可以将实施代码移动到"背景"?当我设计非模板类时,我经常将"界面"类和实现类,前者将通过执行类似getImpl()->foo()
的操作委托后者,以便可以动态链接实现代码。我不确定如何为模板执行此操作。 我认为可能动态链接对模板没有意义吗?
大模板标题(> 1000行)是否常见?还是那么糟糕?如果不好,我该怎么办呢?
我知道这个问题How to reduce output size of template-heavy C++ code?,但我认为我们正在询问不同的事情:该问题的OP试图减少输出的大小,而我试图减少我的库标题本身的大小。
更新:例如,如果您要设计std::vector
,您将如何组织其界面&实施(如果需要)?
答案 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;