gpt4 book ai didi

c++ - 设计 C++ 库

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:35 24 4
gpt4 key购买 nike

我正在设计一个 C++ 静态库。我想让这些类通用/可配置,以便它们可以支持多种数据类型(而且我不想在我的库中编写任何特定于数据类型的代码)。所以我对这些类进行了模板化。

但由于我目前使用的编译器不支持 C++“导出”模板功能,我不得不在头文件中提供类的实现。我不想将我的类的实现细节暴露给将要使用我的库的客户端代码。

你能为我提供一些解决上述问题的设计方案吗??

最佳答案

在模板出现之前,类型不可知的 C++ 代码必须使用运行时多态性来编写。但也可以使用模板,将这两种技术结合起来。

例如,假设您想存储任何类型的值,以供以后检索。如果没有模板,您必须这样做:

struct PrintableThing
{
// declare abstract operations needed on the type
virtual void print(std::ostream &os) = 0;

// polymorphic base class needs virtual destructor
virtual ~PrintableThing() {}
};

class PrintableContainer
{
PrintableThing *printableThing;

public:
// various other secret stuff

void store(PrintableThing *p);
};

这个库的用户必须编写他们自己的 PrintableThing 的派生版本手动环绕自己的数据并实现 print对它起作用。

但是您可以在这样的系统周围包裹一个基于模板的层:

template <T>
struct PrintableType : PrintableThing
{
T instance;

virtual void print(std::ostream &os)
{ os << instance; }

PrintableType(const T &i)
: instance(i) {}
};

并且还在库的header 中添加一个方法,在PrintableContainer 的声明中类:

template <class T>
void store(const T &p)
{
store(new PrintableType(p));
}

这充当模板和运行时多态性之间的桥梁,编译时绑定(bind)到 <<运营商实现 print , 以及复制构造函数(当然也转发到嵌套实例的析构函数)。

这样,你就可以完全基于运行时多态来编写一个库,实现可以隐藏在库的源代码中,只是加了一点模板“糖”,方便使用.

这是否值得麻烦将取决于您的需要。它具有纯粹的技术优势,因为运行时多态性本身有时正是您所需要的。不利的一面是,您无疑会降低编译器有效内联的能力。从好的方面来说,您的编译时间和二进制代码膨胀可能会减少。

例子是 std::tr1::functionboost::any ,它有一个非常干净、现代的基于 C++ 模板的前端,但在幕后作为运行时多态容器工作。

关于c++ - 设计 C++ 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1147588/

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