将带有占位符的绑定结果存储在 std::function 中
Storing the result of a bind with placeholders in a std::function
我一直在阅读如何对常规函数执行 std::bind。
并将自由函数或成员函数存入一个std::function。
但是,如果我尝试对一个参数使用占位符,对另一个参数使用实际值;我无法调用(导致编译错误)std::function
所以我尝试了以下代码:
#include <random>
#include <iostream>
#include <memory>
#include <functional>
int g(int n1, int n2)
{
return n1+n2;
}
int main()
{
using namespace std::placeholders; // for _1, _2, _3...
std::function<int(int,int)> f3 = std::bind(&g, std::placeholders::_1, 4);
std::cout << f3(1) << '\n';
//this works just fine
auto f4 = std::bind(&g, std::placeholders::_1, 4);
std::cout << f4(1) << '\n';
}
我收到以下错误 g++ 4.7
prog.cpp: In function 'int main()':
prog.cpp:17:22: error: no match for call to '(std::function<int(int, int)>) (int)'
std::cout << f3(1) << '\n';
^
In file included from /usr/include/c++/4.9/memory:79:0,
from prog.cpp:3:
/usr/include/c++/4.9/functional:2142:11: note: candidate is:
class function<_Res(_ArgTypes...)>
^
/usr/include/c++/4.9/functional:2434:5: note: _Res std::function<_Res(_ArgTypes ...)>::operator()(_ArgTypes ...) const [with _Res = int; _ArgTypes = {int, int}]
function<_Res(_ArgTypes...)>::
^
/usr/include/c++/4.9/functional:2434:5: note: candidate expects 2 arguments, 1 provided
如果您将一个参数绑定到函数 int g(int, int)
,剩下的可调用函数是一个以 one int 作为参数的函数,而不是两个。
试试这个:
std::function<int(int)> f3 = std::bind(&g, std::placeholders::_1, 4);
你的 std::function
类型应该是:
std::function<int(int)> f3 = std::bind(&g, std::placeholders::_1, 4);
~~~
one argument
您的 bind
创建了一个带有一个参数的函数。这就是为什么你这样称呼 f3 的原因:
std::cout << f3(1) << '\n';
note: candidate expects 2 arguments, 1 provided
应该是你的线索
我一直在阅读如何对常规函数执行 std::bind。 并将自由函数或成员函数存入一个std::function。 但是,如果我尝试对一个参数使用占位符,对另一个参数使用实际值;我无法调用(导致编译错误)std::function
所以我尝试了以下代码:
#include <random>
#include <iostream>
#include <memory>
#include <functional>
int g(int n1, int n2)
{
return n1+n2;
}
int main()
{
using namespace std::placeholders; // for _1, _2, _3...
std::function<int(int,int)> f3 = std::bind(&g, std::placeholders::_1, 4);
std::cout << f3(1) << '\n';
//this works just fine
auto f4 = std::bind(&g, std::placeholders::_1, 4);
std::cout << f4(1) << '\n';
}
我收到以下错误 g++ 4.7
prog.cpp: In function 'int main()':
prog.cpp:17:22: error: no match for call to '(std::function<int(int, int)>) (int)'
std::cout << f3(1) << '\n';
^
In file included from /usr/include/c++/4.9/memory:79:0,
from prog.cpp:3:
/usr/include/c++/4.9/functional:2142:11: note: candidate is:
class function<_Res(_ArgTypes...)>
^
/usr/include/c++/4.9/functional:2434:5: note: _Res std::function<_Res(_ArgTypes ...)>::operator()(_ArgTypes ...) const [with _Res = int; _ArgTypes = {int, int}]
function<_Res(_ArgTypes...)>::
^
/usr/include/c++/4.9/functional:2434:5: note: candidate expects 2 arguments, 1 provided
如果您将一个参数绑定到函数 int g(int, int)
,剩下的可调用函数是一个以 one int 作为参数的函数,而不是两个。
试试这个:
std::function<int(int)> f3 = std::bind(&g, std::placeholders::_1, 4);
你的 std::function
类型应该是:
std::function<int(int)> f3 = std::bind(&g, std::placeholders::_1, 4);
~~~
one argument
您的 bind
创建了一个带有一个参数的函数。这就是为什么你这样称呼 f3 的原因:
std::cout << f3(1) << '\n';
note: candidate expects 2 arguments, 1 provided
应该是你的线索