使用std :: function作为API(跨模块边界)

时间:2012-02-26 20:58:08

标签: c++ c++11 std-function

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

我在想'不',因为我认为没有任何保证一个供应商的std::function实现与其他供应商兼容。是这样的吗?

如果我怀疑答案是否定的,你们怎么处理这类事情?我可能不得不求助于实现我自己或者只是避免像std::function这样的东西(例如:使用函数指针或函数)。 :-(我发现自己在很多情况下都是这样做的(重新发明了许多标准C ++库,当然甚至令人遗憾的是,我们自己的STL兼容矢量类型支持范围ctor和fill ctor,自定义分配器等当然不是很有趣,我怀疑它和标准实现一样好,只是因为人们可以动态地链接到一个库,比如MSVC 2010从mingw编写的二进制文件实现std :: function,例如

当然,替代方案是在我们的API中根本不使用这些类型的C ++特性并使用C接口,但是由于我们使用API​​作为内部和第三方开发的中央API。

1 个答案:

答案 0 :(得分:8)

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

即使您编写自己的包装器,它们也必须使用该包装器的特定版本,但显然这样做更容易实现。

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