目录
包装器
function包装器
bind
包装器
function包装器
function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。
上面的程序验证,我们会发现useF函数模板实例化了三份。
包装器可以很好的解决上面的问题 ,让它只实例化成一份
包装器在这个头文件里面std::function在头文件<functional>
template <class Ret, class... Args>
class function<Ret(Args...)>;
模板参数说明:
Ret: 被调用函数的返回类型
Args…:被调用函数的形参
静态成员函数可以直接调用,非静态比较麻烦,这样调用会报错,加取地址符号是语法规定
这里报错是因为成员函数的指针不能直接进行调用,如果要调用则必须用对象去调用
这样即可正常调用
解决最开始的问题
包装器例题 力扣
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> st;
map<string,function<long long(long long,long long)>> mp=
{
{"+",[](long long a,long long b){return a+b;}},
{"-",[](long long a,long long b){return a-b;}},
{"*",[](long long a,long long b){return a*b;}},
{"/",[](long long a,long long b){return a/b;}},
};
for(auto & str:tokens)
{
if(mp.count(str))//操作符
{
long long right=st.top();
st.pop();
long long left=st.top();
st.pop();
st.push(mp[str](left,right));
}
else
{
st.push(stoll(str));
}
}
return st.top();
}
};
bind
std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可
调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。一般而
言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M
可以大于N,但这么做没什么意义)参数的新函数。同时,使用std::bind函数还可以实现参数顺
序调整等操作。
// 原型如下:
template <class Fn, class... Args>
/* unspecified */ bind (Fn&& fn, Args&&... args);
// with return type (2)
template <class Ret, class Fn, class... Args>
/* unspecified */ bind (Fn&& fn, Args&&... args);
可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对
象来“适应”原对象的参数列表,bind对参数进行适配。
如果要直接使用Sub是不行的,我们可以选择多传一个参数或用Bind
调用bind的一般形式:auto newCallable = bind(callable,arg_list);
其中,newCallable本身是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的
callable的参数。当我们调用newCallable时,newCallable会调用callable,并传给它arg_list中
的参数。
arg_list中的参数可能包含形如_n的名字,其中n是一个整数,这些参数是“占位符”,表示
newCallable的参数,它们占据了传递给newCallable的参数的“位置”。数值n表示生成的可调用对
象中参数的位置:_1为newCallable的第一个参数,_2为第二个参数,以此类推
Fn是function
_1,_2,_3分别代表第一个,第二个和第三个参数,他们定义在placeholders的命名空间中
使用场景
如果我们就想传参让成员函数和普通函数保持一致,就按照下面方式传参,这时可用bind
这里的作用主要是绑死固定的参数,Sub()被绑死
1.5被绑死