为API使用std::函数(跨越模块边界)
Using std::function for an API (across module boundaries)
我很确定我知道这个问题的答案(认为不是),但可以安全地接受/返回API中的值std::function
(跨越模块边界)吗?
我认为"不",因为我认为不能保证一个供应商的std::function
实现与另一个供应商兼容。是这样吗?
如果答案像我怀疑的那样是否定的,你们是如何处理这种事情的?我可能不得不实现我自己的,或者干脆避免std::function
之类的东西(例如:使用函数指针或类函数)-(我发现自己以前在很多情况下都这样做过(重新设计了很多标准C++库,当然令人遗憾的是,甚至制作了我们自己的STL兼容向量类型,同时支持range ctor和fill ctor、自定义分配器等,这当然不好玩,我怀疑它是否像标准实现一样好),因为可能会动态链接到一个库,MSVC 2010对std::函数的实现来自用mingw编写的二进制文件,例如
当然,另一种选择是在我们的API中完全不使用这些类型的C++功能,而是使用C接口,但这对我们来说代价相当大,因为我们使用API作为内部和第三方开发的中心API。
你可以做到,只要每个人都按照相同的规则玩,并且你的标准库是动态链接的。如果第三方知道他们必须使用某个编译器和该编译器的某个版本,并带有特定的构建标志,那么就没有问题。
即使您编写自己的包装器,他们也必须使用该包装器的特定版本,尽管这显然更容易实施。
但实际上,这就是通过DLL进行交互操作所付出的代价:每个人都必须在同一页上,否则就无法工作。或者你必须坚持使用基本类型或自制的受控接口。
相关文章:
- 尝试导入pybind-opencv模块时出现libgtk错误
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 内联如何影响模块接口中的成员函数
- C++返回 Numpy 数组的 Python 扩展模块
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 如何从线程中的不同模块调用函数?
- 如何使用 soong 命名空间来有条件地编译模块
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- CMake - 模块 + 库混淆
- 特征 LLT 模块给出不正确的结果?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 python 模块中导入子模块时PyImport_Import失败
- 将 PCL 链接到 Cython C++ 模块
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- 电源功能模块化操作
- 如何告诉本机节点模块所需的dll存储在哪里?
- 如何为模块化应用程序实现C++插件系统
- 清理跨越Windows DLL模块边界的堆分配资源时出现问题
- 为API使用std::函数(跨越模块边界)