gpt4 book ai didi

c++ - 减少模板标题的大小

转载 作者:太空狗 更新时间:2023-10-29 23:13:50 25 4
gpt4 key购买 nike

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

  1. 是否有某种设计模式可以将实现代码移至“后台”?当我设计非模板类时,我经常将“接口(interface)”类和实现类分开,前者会通过getImpl()->foo()之类的方式委托(delegate)给后者,这样实现代码可以动态链接。我不确定如何为模板执行此操作。 我认为动态链接可能对模板没有意义?

  2. 大模板标题(> 1000 行)是否常见?还是那样不好?如果它不好,我能用它做什么?

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

更新:例如,如果您要设计 std::vector,您将如何组织其接口(interface)和实现(如果需要)?

最佳答案

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

如果您担心 1000 行,请查看 vector 。在 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>;

主要.cpp:

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

关于c++ - 减少模板标题的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37041850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com