为API使用std::函数(跨越模块边界)

Using std::function for an API (across module boundaries)

本文关键字:跨越 模块 边界 函数 API 使用 std      更新时间:2023-10-16

我很确定我知道这个问题的答案(认为不是),但可以安全地接受/返回API中的值std::function(跨越模块边界)吗?

我认为"不",因为我认为不能保证一个供应商的std::function实现与另一个供应商兼容。是这样吗?

如果答案像我怀疑的那样是否定的,你们是如何处理这种事情的?我可能不得不实现我自己的,或者干脆避免std::function之类的东西(例如:使用函数指针或类函数)-(我发现自己以前在很多情况下都这样做过(重新设计了很多标准C++库,当然令人遗憾的是,甚至制作了我们自己的STL兼容向量类型,同时支持range ctor和fill ctor、自定义分配器等,这当然不好玩,我怀疑它是否像标准实现一样好),因为可能会动态链接到一个库,MSVC 2010对std::函数的实现来自用mingw编写的二进制文件,例如

当然,另一种选择是在我们的API中完全不使用这些类型的C++功能,而是使用C接口,但这对我们来说代价相当大,因为我们使用API作为内部和第三方开发的中心API。

你可以做到,只要每个人都按照相同的规则玩,并且你的标准库是动态链接的。如果第三方知道他们必须使用某个编译器和该编译器的某个版本,并带有特定的构建标志,那么就没有问题。

即使您编写自己的包装器,他们也必须使用该包装器的特定版本,尽管这显然更容易实施。

但实际上,这就是通过DLL进行交互操作所付出的代价:每个人都必须在同一页上,否则就无法工作。或者你必须坚持使用基本类型或自制的受控接口。