减小模板标头的大小

Reduce sizes of template headers

本文关键字:      更新时间:2023-10-16

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

  1. 是否有一些将实现代码移到"后台"的设计模式?当我设计非模板类时,我经常将"接口"类和实现类分开,前者会通过做getImpl()->foo()之类的事情委托给后者,这样实现代码就可以动态链接到。我不知道如何为模板做到这一点我认为动态链接对模板来说可能没有意义

  2. 大模板标题(>1000行)常见吗?或者这很糟糕?如果不好,我该怎么办?

我知道这个问题如何减少模板密集的C++代码的输出大小?,但我认为我们在问不同的问题:这个问题的OP试图缩小输出的大小,而我则试图缩小我的库头本身的大小。

UPDATE:例如,如果您要设计std::vector,您将如何组织它的接口&实施(如果需要)?

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

若你们担心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; 
相关文章:
  • 没有找到相关文章