06 October 2023

C++ 核心指南目录

“Use a non-template core implementation to provide an ABI-stable interface”

理由

提升代码可读性。避免代码膨胀。

例子

可以是一个基类。

struct Link_base {   // stable
    Link_base* suc;
    Link_base* pre;
};

template<typename T>   // templated wrapper to add type safety
struct Link : Link_base {
    T val;
};

struct List_base {
    Link_base* first;   // first element (if any)
    int sz;             // number of elements
    void add_front(Link_base* p);
    // ...
};

template<typename T>
class List : List_base {
public:
    void put_front(const T& e) { add_front(new Link<T>{e}); }   // implicit cast to Link_base
    T& front() { static_cast<Link<T>*>(first).val; }   // explicit cast back to Link<T>
    // ...
};

List<int> li;
List<string> ls;

这样,就只有一份添加/删除 List 元素的操作。 LinkList 啥也不做,只是处理类型信息。

除了这种单独的基础类型,另一个常用的技术是把 voidvoid* 实例化,然后通过模板参数 T 来安全地进行封装类型转换。

其他方案

  • 使用 Pimpl 实现方式。