相关疑难解决方法(0)

c ++ 11:如何编写包装函数来生成`std :: function`对象

我正在尝试编写一个包装器make_function,它std::make_pair可以std::function用合适的可调用对象创建一个对象.

就像make_pair对于函数指针一样foo,auto f0 = make_function(foo);创建一个正确类型签名的std::function函数对象f0.只是为了澄清,我不介意偶尔给出类型参数make_function,以防很难(或不可能)从参数中完全推断出类型.

到目前为止我提出的(下面的代码)适用于lambdas,一些函数指针和函子(我没有考虑挥发性).但我无法让它起作用std::bindstd::bind<R>结果.在下面的代码中

auto f2 = make_function(std::bind(foo,_1,_2,_3)); //not OK
Run Code Online (Sandbox Code Playgroud)

不会编译/工作,使用gcc 4.8.1.我猜测,我没有捕捉到operator()bind正确的结果,但我不知道如何解决它.

任何有关如何解决此案例或改善其他角落案件的帮助表示赞赏.

当然,我的问题是如何修复下面示例中的错误.

对于后台,我可以在这个问题中找到我使用此包装器的一种情况:如何使C++ 11函数采用函数<>参数自动接受lambdas.如果您不批准使用std::function或以我的具体使用方式,请在该帖子中留下您的意见,并在此处讨论技术问题.

---编辑---

从一些评论中,我了解到这是因为模糊性问题(std::bind结果函数调用operator()的模糊性).正如@Mooing Duck的回答所指出的,解决方案是明确地给出参数类型.我已经更新了代码以结合@Mooing Duck的答案中的三个函数(稍微更改了类型参数),这样make_function包装器现在可以像以前一样处理/类型推导明确的情况,并允许指定完整类型签名歧义.

(我的明确案例的原始代码位于:https://stackoverflow.com/a/21665705/683218,可在以下网址进行测试:https://ideone.com/UhAk91):

#include <functional>
#include <utility>
#include <iostream>
#include <functional>
using namespace std;

// For …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 std-function c++14

9
推荐指数
2
解决办法
3427
查看次数

标签 统计

c++ ×1

c++11 ×1

c++14 ×1

std-function ×1