std::bind与std::function
调用std::bind的一般形式为
auto newCallable = bind(callable, arg_list);
newCallable本身是一个可调用对象,arg_list是一个用逗号分隔的参数列表。当我们调用newCallable的时候会调用callable并且传给它arg_list里面的参数
std::bind是c++11的新特性,它接受一个可调用对象生成一个新的可调用对象来适应原对象的参数列表。举一个例子
bool compare_num(int a, int b)
{
bool ans = a < b;
cout << ans << endl;
return ans;
}
class my_toolbox
{
public:
static int power_num(int a, int b)
{
int ans = pow(a, b);
cout << ans << endl;
return ans;
}
};
上面是函数的定义,如果我们正常使用compare_num函数则需要传两个参数进去,写成例如如下的形式
compare_num(1, 3)
如果我们使用了bind,就可以用下面的办法
auto test1_1 = bind(compare_num, 1, 2);
test1_1();
我们让原本需要传两个参数的函数现在将默认值1和2填了进去,调用的时候直接test1_1() 就可以
如果我们想要有一个是默认参数,另一个是我们自己传
auto test1_2 = bind(compare_num, 1, placeholders::_2);
同时,bind还能够有调整传参数顺序的能力
auto test1_3 = bind(compare_num, placeholders::_2, placeholders::_1);
test1_3(5,6);
如果我们按照上面这样写,我们如果调用了test1_3,那么我们则调用了compare_num,并且将test1_3里面的第一个参数作为compare_num的第二个参数,test1_3里面的第二个参数作为compare_num的第一个参数
假设有这样几个不同类型的可调用对象
int add(int i, int j)
{
return i + j;
}
auto mod = [](int i, int j){ return i % j; };
struct divide
{
int operator()(int denominator, int divisor)
{
return denominator / divisor;
}
};
我们希望做一个计算器,尝试使用键值对,不同的key表示不同的运算,于是想到了使用map, map的定义如下
map<string, int(*)(int, int)> binops
这样定义则只能够将add添加到map中,因为别的可调用对象无法匹配值的类型
fucntion可以帮助我们解决上面的问题,function的简单理解是
通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的 std::function对象;让我们不再纠结那么多的可调用实体。一切变的简单粗暴。
function<int(int, int)> f1 = add;
function<int(int, int)> f2 = divide();
function<int(int, int)> f3 = mod;
我们可以这样使用
cout << f1(4, 2) << endl;
cout << f2(4, 2) << endl;
cout << f3(4, 2) << endl;
如果希望能够使用map将这些可调用对象调用,我们可以定义如下的map
map<string, function<int(int, int)>> binops_func;
binops_func.insert({"+", add});
binops_func.insert({"%", mod});
binops_func.insert({"/", divide()});
如果我们定义的函数中有重载函数
double add_2(int i, int j)
{
return i + j;
}
float add_2(float i, float j)
{
return i + j;
}
我们需要使用函数指针
double (*fp_1)(int, int) = add_2;
float (*fp_2)(float, float) = add_2;
binops_func.insert({"++", fp_1});
binops_func.insert({"+++", fp_2});
如果我们要使用map,如下代码可以实现
cout << binops_func["+"](10, 5) << endl;
cout << binops_func["%"](10, 5) << endl;
cout << binops_func["/"](10, 5) << endl;
代表key值为"+", 给函数传值为10,5
参考:C++ Primer
|