C++ 接口形式

记录编写 C++ 代码过程中的疑惑、避坑的技巧等

深入理解 C++

模板遇上 DLL 导出

模板是为了共用代码,使用模板时首先要完成实例化,而实例化要求看到模板的完整定义才可以。所以,如果给用户使用暴露模板,就要暴露模板的实现细节。

DLL 是为了隐藏实现,只给用户暴露使用的接口,其中的具体实现用户是看不到的,也不需要关心。DLL 包装起来的是类的定义,而不是模板。所以,不存在“导出模板”,如果暴露模板定义给用户,那么用户是应当看到模板所有细节的,直接使用模板实例化(类或者函数)来用即可。

如果不想暴露具体的实现,只能先实例化成具体的类或函数,然后将类或者函数导出。

模板函数遇上 DLL

待补充

模板类遇上 DLL

一般无需导出整个类,只需导出部分 public 成员函数即可。

  1. 在 windows 平台编译 glog 库,在 StockDataLayer 项目中使用 glog 输出日志;

  2. 补全 DMSGConsumer 分发任务时的 else if 分支、

  3. 将对象池模板、延迟发送等代码生成动态库,供 test 源码调用,验证 dll 边界

    暴露了 Stock 模板定义给用户

  4. 因为核心代码 Stock 及其对象池都是模板,考虑能否以 single header file 的形式供用户使用

  5. 在模板基础上全部实例化,针对实例化之后的类做导入导出;

  6. 包装回调签名中的数据交换类,相应地增加「增删回调」接口;

虚函数

用户未定义,编译器自动合成的析构函数是否会直接设定成虚函数?还是会上下文推导当其存在子类时才加 virtual,否则不加 virtual?所以定义基类(声明接口)时无需显式定义 virtual dtor() = default; ?多写这一行没意义吧?

当基类中某个函数设置为虚函数之后,子类 override 时即便不加 virtual 关键词,其(子类中的)依旧是虚函数吧?不然再次继承时,无法 override

考虑虚函数的替代者

工作中 YDData2 接口中的回调,以及指标公式回传结果。都让我想起一段文字:

ACE 犯了早期 C++ 库都会犯的一个错误,过度设计, 过度java化。所谓 java 化, 就是以对象代替接口,以虚函数代替回调,以继承代替组合。以虚类代替模板。对象间关系错综复杂,牵一发而动全身。那些年我们追过的网络库

《effective c++》 Item 35 考虑虚函数的替代者