Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为API使用std::函数(跨模块边界)_C++_C++11_Std Function - Fatal编程技术网

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

C++ 为API使用std::函数(跨模块边界),c++,c++11,std-function,C++,C++11,Std Function,我很确定我知道这个问题的答案(认为是否定的),但我们能否安全地接受/返回API中的std::function(跨模块边界) 我认为“不”,因为我认为不能保证一个供应商的std::function实现与另一个供应商的兼容。是这样吗 如果答案如我所怀疑的那样是否定的,你们如何处理这类事情?我可能不得不求助于实现我自己的功能,或者干脆避免像std::function这样的东西(例如:使用函数指针或functionoid):-(在很多情况下,我发现自己在做很多事情之前(重新创建了很多标准的C++库,当然

我很确定我知道这个问题的答案(认为是否定的),但我们能否安全地接受/返回API中的
std::function
(跨模块边界)

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

如果答案如我所怀疑的那样是否定的,你们如何处理这类事情?我可能不得不求助于实现我自己的功能,或者干脆避免像
std::function
这样的东西(例如:使用函数指针或functionoid):-(在很多情况下,我发现自己在做很多事情之前(重新创建了很多标准的C++库,当然也很遗憾,甚至连我们自己的STL兼容的向量类型都支持范围CCTR和填充CCTR,自定义分配器等,当然不是好玩的,我怀疑它和标准实现一样好)。这仅仅是因为你可能会动态链接到一个库,比如说,MSVC 2010从一个用mingw编写的二进制文件中实现了std::function,例如


P>当然,在API中使用这些C++特性是不可能的,例如,使用C接口,但这将给我们带来相当大的成本,因为我们使用API作为内部和第三方开发的中心API。

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

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


但是,这是你通过DLL进行交互的代价:每个人都必须在同一个页面上,否则它就不能工作。或者你必须坚持基本类型或家庭控制的接口。< /P>这是与编译的C++库面对的问题相同的……KeRekSb:不是静态库。只是使用标准的DLL。d库类型跨越DLL边界。它也不是用C类型保存的(比如
文件*
),但是你通常不会看到有人想把它们跨越DLL。似乎是这样。我一直想知道人们是如何处理它的(例如:如果我们可以使用一些跨编译器的替代方案,比如说,通过SDK分发源代码,它们可以跨模块工作)总是希望在C++中跨模块边界使用更多的注意,因为我们通过在DLL /共享库中实现的API集中开发,并且类似STD::函数是有用的代替正则回调或函数,特别是添加lambda表达式。lution是我们一直在做的大部分工作,但复制一些基本标准库类型(如vector、wstring、unique_ptr、shared_ptr、function等)的有用性是一件非常痛苦的事情,这些类型对于构建公共接口来说是非常好的。几乎迫使我开始为这些如果没有人已经这么做了,那就很有意思了。我们正考虑用boost来做这件事,但这也变得有些棘手,因为boost太大了,开发人员可能想要使用比我们发布的版本更新的版本,例如boost是我们考虑过发布的东西,但它有点困难,因为它太大了,我们经常想知道会有什么问题d如果第三方已经在使用与我们发布的版本不同的boost,就会发生这种情况。它会使我们的SDK比现在大很多倍,而且仅仅使用它的某些部分有点困难,因为很多功能都是从boost的其他部分构建的。也许我们应该再看一次,因为boost::function在我们的应用程序中工作得很好在这种情况下,支持许多不同的编译器肯定是非常好的。@Study472:然后您需要做出选择:您希望对第三方施加多少限制,还是希望对API施加多少限制?另外,请注意,对于一个编译器,
boost::function
不保证与
boost::function
用于另一个编译器。由于编译器之间可能存在填充/对齐差异,我甚至不建议与自产类型进行这种互操作。如果您需要有人在不同于您使用的编译器中工作,那么您需要跨DLL边界使用基本类型。这是有意义的。在实践中,我们发现在互操作性方面有一定的舒适度(例如:只要存在至少支持流行编译器的解决方案,就需要对结构填充进行某些设置)。在实际情况下,我们会尝试使用最小公分母方法(例如:接受常量指针和大小,而不是向量,因为这也使得API更加灵活,只需要表示是连续的).在其他情况下,我们使用了一种较低级别的API与非常有限的类型的混合,同时在其上提供了包装器……提供了更方便的接口,在那里我们可以自由使用我们想要的任何标准库功能,因为所有包装器代码都是静态链接的。我可能会尝试进一步探索这一途径……玩弄将std::function之类的内容轻松转换为functionoid的想法。