记录编写 C++ 代码过程中的疑惑、避坑的技巧等
深入理解 C++
模板遇上 DLL 导出
模板是为了共用代码,使用模板时首先要完成实例化,而实例化要求看到模板的完整定义才可以。所以,如果给用户使用暴露模板,就要暴露模板的实现细节。
DLL 是为了隐藏实现,只给用户暴露使用的接口,其中的具体实现用户是看不到的,也不需要关心。DLL 包装起来的是类的定义,而不是模板。所以,不存在“导出模板”,如果暴露模板定义给用户,那么用户是应当看到模板所有细节的,直接使用模板实例化(类或者函数)来用即可。
如果不想暴露具体的实现,只能先实例化成具体的类或函数,然后将类或者函数导出。
模板函数遇上 DLL
待补充
模板类遇上 DLL
一般无需导出整个类,只需导出部分 public
成员函数即可。
在 windows 平台编译 glog 库,在 StockDataLayer 项目中使用 glog 输出日志;
补全 DMSGConsumer 分发任务时的 else if 分支、
将对象池模板、延迟发送等代码生成动态库,供 test 源码调用,验证 dll 边界
暴露了 Stock 模板定义给用户
因为核心代码 Stock 及其对象池都是模板,考虑能否以 single header file 的形式供用户使用
在模板基础上全部实例化,针对实例化之后的类做导入导出;
包装回调签名中的数据交换类,相应地增加「增删回调」接口;
虚函数
用户未定义,编译器自动合成的析构函数是否会直接设定成虚函数?还是会上下文推导当其存在子类时才加 virtual
,否则不加 virtual
?所以定义基类(声明接口)时无需显式定义 virtual dtor() = default;
?多写这一行没意义吧?
当基类中某个函数设置为虚函数之后,子类 override 时即便不加 virtual 关键词,其(子类中的)依旧是虚函数吧?不然再次继承时,无法 override
。
考虑虚函数的替代者
工作中 YDData2 接口中的回调,以及指标公式回传结果。都让我想起一段文字:
ACE 犯了早期 C++ 库都会犯的一个错误,过度设计, 过度java化。所谓 java 化, 就是以对象代替接口,以虚函数代替回调,以继承代替组合。以虚类代替模板。对象间关系错综复杂,牵一发而动全身。那些年我们追过的网络库