IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> std::bind与std::function -> 正文阅读

[C++知识库]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<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;
}

我们需要使用函数指针

//这句话表示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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-16 19:28:07  更:2021-10-16 19:30:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:11:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码