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

问题描述 投票:4回答:1

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

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

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

当然,替代方案是在我们的API中根本不使用这些类型的C ++特性并使用C接口,但由于我们使用API​​作为中心API,因此这将花费相当沉重的代价。内部和第三方发展。

c++ c++11 std-function
1个回答
8
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.