摘要:
SWIG(Simplified Wrapper and Interface Generator)是一个为C/C++库提供脚本调用支持的工具,支持Lua, Perl, Python, Go等多种脚本语言。如果不了解可以参考Interfacing C/C++ and Python with SWIG。本文主要关注在SWIG Python中如何实现绑定已有C++实例,想象一下,调试时如果可以不用重新编译... 阅读全文
摘要:
Boost.Serialization是一个C++对象序列化库,支持raw指针、STL容器、智能指针等,功能很强大(简介link)。但是实现时大量使用了宏和模板,源码比较复杂,文档不够完善,需要自定义一些东西时比较麻烦。本文中提供了自定义Archive的和动态配置序列化的实现。 假设有需求,希望动态控制其序列化,类似stackoverflow的问题link1和link2。有时候为了效率希望忽略某... 阅读全文
摘要:
在陈硕的github中看到一段非常有意思的代码,可以实现根据消息类型分发到不同的回调函数(link)。代码里是用的Protobuf的反射,本文使用支持多基类的C++类反射实现文中的的反射来改写一下。 首先来定义接口,如果是下面的用例,使用一个类名为key,callback函数为value的hash表就很容易的实现了: class Foo : public Object{};void OnRec... 阅读全文
摘要:
本文中的类反射指的是实例的类型识别(RTTI)、动态创建,继承链遍历能力,不讨论成员函数、成员变量等的反射。即实现以下类似接口: class Foo : public Object{};Object *obj1 = new Foo();IsKindOf(obj1, "Foo"); // 类型识别Object *obj2 = CreateObject("Foo"); // 动态创建GetBase... 阅读全文
摘要:
陈硕在《C++工程实践经验谈》在二进制兼容性和避免使用虚函数作为库的接口两节中说到COM使用虚函数暴露接口的做法破坏了动态链接库的二进制兼容性 。1. 为什么需要动态链接库假设我们开发了一个图形库我们要将我们的库发布出去无非有以下几种方式:1) 源码:这种方式最直接,但是有两个比较明显的缺点:暴露了实现、对库的任何修改都需要用户重新编译。2) 静态库:静态库不会暴露实现,但是同样需要重新编译3) 动态链接库:2. 解决二进制兼容性ceshi3. COM中的做法4. 总结番外篇(为什么我们需要接口继承)白盒继承黑盒继承 阅读全文