我正在尝试编写一个包装器make_function
,它std::make_pair
可以std::function
用合适的可调用对象创建一个对象.
就像make_pair
对于函数指针一样foo
,auto f0 = make_function(foo);
创建一个正确类型签名的std::function
函数对象f0
.只是为了澄清,我不介意偶尔给出类型参数make_function
,以防很难(或不可能)从参数中完全推断出类型.
到目前为止我提出的(下面的代码)适用于lambdas,一些函数指针和函子(我没有考虑挥发性).但我无法让它起作用std::bind
或std::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)