7

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

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

如果我怀疑答案是否定的,那么你们都是如何处理这种事情的?我可能不得不求助于自己的实现,或者只是避免类似的事情std::function(例如:使用函数指针或函数)。:-( 我发现自己以前在很多情况下都这样做过(重新发明了很多标准 C++ 库,当然遗憾的是,甚至制作了我们自己的符合 STL 的向量类型,同时支持范围 ctor 和填充 ctor、自定义分配器等. 肯定不好玩,我怀疑它是否与标准实现一样好)仅仅是因为可以动态链接到一个库,例如,MSVC 2010 的 std::function 实现来自用 mingw 编写的二进制文件,例如

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

4

1 回答 1

9

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

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

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

于 2012-02-26T21:04:11.143 回答