std::bind与std::function

std::bind与std::function,第1张

std::bind与std::function std::bind与std::function
  • std::bind

调用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的第一个参数

  • std::function

假设有这样几个不同类型的可调用对象

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 binops

这样定义则只能够将add添加到map中,因为别的可调用对象无法匹配值的类型

fucntion可以帮助我们解决上面的问题,function的简单理解是

通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象;让我们不再纠结那么多的可调用实体。一切变的简单粗暴。

function f1 = add;
function f2 = divide();
function f3 = mod;

我们可以这样使用

cout << f1(4, 2) << endl;
cout << f2(4, 2) << endl;
cout << f3(4, 2) << endl;

如果希望能够使用map将这些可调用对象调用,我们可以定义如下的map

map> 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;
}

我们需要使用函数指针

//这句话表示fp_1指向一个函数,函数的参数是两个int,返回值是double,括号不能省略
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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/3971702.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-10-21
下一篇 2022-10-21

发表评论

登录后才能评论

评论列表(0条)

保存