首页 > 编程语言 >C++11新特性之std::function和bind绑定器

C++11新特性之std::function和bind绑定器

时间:2023-04-02 13:34:32浏览次数:43  
标签:11 std 函数 function 对象 函数指针 include

在C++中,存在可调用对象这一个概念,可调用对象有以下几种定义:

(1).是一个函数指针

(2).是一个具有operator()成员函数的类对象(仿函数)

(3).是一个可被转换为函数指针的类对象

(4).是一个类成员(函数指针)

一、可调用对象包装器----std::function

std::function是可调用对象的包装器,它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象。通过执行它的类模板参数,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟执行它们。

#include <QCoreApplication>
#include <QDebug>

void func()
{
    qDebug() << __FUNCTION__;
}

class Foo {
public:
    static int foo_func(int a) {
        qDebug() << __FUNCTION__ <<"Foo";
        return a;
    }
};

class Bar {
public:
    int operator()(int a) {
        qDebug() <<__FUNCTION__ <<"Bar";
        return a;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    /* 绑定一个普通函数 */
    std::function<void()> fr1 = func;
    fr1();

    /* 绑定一个类的静态成员函数 */
    std::function<int(int)> fr2 = Foo::foo_func;
    qDebug() << fr2(123);

    /* 绑定一个仿函数 */
    Bar bar;
    fr2 = bar;
    qDebug() << fr2(123);

    return a.exec();
}

运行结果如下:

 

 再来看下面的示例:

#include <QCoreApplication>
#include <QDebug>

class A {
public:
    A(const std::function<void()>& f):callback_(f){};
    void notify() {
        callback_(); /* 回调到上层 */
    }

private:
    std::function<void()> callback_;
};

class Foo {
public:
    void operator()() {
        qDebug() <<__FUNCTION__;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Foo foo;
    A aa(foo);
    aa.notify();

    return a.exec();
}

从上面的示例中可以看出,std::function可以取代函数指针的作用,因为它可以保存函数延迟执行,所以比较适合作为回调函数。

标签:11,std,函数,function,对象,函数指针,include
From: https://www.cnblogs.com/QingYiShouJiuRen/p/17280312.html

相关文章

  • 11、随机数
    /***@authorly(个人博客:https://www.cnblogs.com/qbbit)*@date2023/4/115:51*@tags喜欢就去努力的争取*/packagemainimport( "fmt" "math/rand" "time")funcmain(){ //随机数 i:=rand.Int() fmt.Println("i:"......
  • 【月伴流星】Win10+Win11 22h2 专业精简版合集2023.04(速度贼快)
     本精简版为重度精简,不支持更新!删除了所有WinSxS内的组件硬链接,使WinSxS的体积由原来的的6G一下子缩小到60M左右,完全丧失了组件恢复功能,相当于删除了组件备份!而保留的下来组件完全不受影响均可正常使用!------------------------------------------系统为Win10+Win11精简专业版合......
  • 代码随想录Day17-Leetcode110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和
    110.平衡二叉树题目链接:https://leetcode.cn/problems/balanced-binary-tree/一个显然但似乎不太高效的方法是:通过递归获取左右子树高度,判断差;然后递归判断左右结点;那么一个显然的改进就是后序遍历/***Definitionforabinarytreenode.*functionTreeNode(val......
  • day11| 20.有效的括号;150.逆波兰表达式求值;1047.删除字符串中的所有相邻重复项
    20.有效的括号 题目简述:给定一个只包括'(',')','{','}','[',']' 的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。 思路:1.利用一个栈实现2.构建一个字典,键......
  • var b = 10; (function b() {b = 20; console.log(b); })();会打印什么你了解吗?
    要知道打印什么需要具备2个知识点一、函数声明和函数表达式的区别二、匿名函数与具名函数的区别首先来说说第一点:要区分函数声明和函数表达式,只需要知道function是不是声明中的第一个词,如果是,那就是函数声明,否则就是函数表达式;函数声明和函数表达式之间最重要的区别是......
  • macos:用homebrew安装node/安装vue-cli( node v18.15.0/ Homebrew 4.0.10-119)
    一,用brew安装nodeliuhongdi@liuhongdideMacBook-ProHomebrew%brewinstallnode@18==>Downloadinghttps://formulae.brew.sh/api/formula.jws.json#=#=#==>Fetchingnode......
  • homebrew:常用命令(Homebrew 4.0.10-119)
    一,brew常用的命令1,查看brew下载文件的缓存目录liuhongdi@liuhongdideMacBook-ProHomebrew%brew--cache/Users/liuhongdi/Library/Caches/Homebrew2,查看brew的安装目录liuhongdi@liuhongdideMacBook-ProHomebrew%brew--prefix/usr/local也可以:liuhongd......
  • homebrew: 配置国内源(Homebrew 4.0.10-119)
    一,查看brew的安装目录:liuhongdi@liuhongdideMacBook-Propoem%cd"$(brew--repo)"liuhongdi@liuhongdideMacBook-ProHomebrew%pwd/usr/local/Homebrew说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest     对应的源......
  • 常见dos命令 win11
    打开CMD的方式右键win,选择终端Win键+R,输入CMD打开控制台在任意文件夹下,shift+右键,选择在终端中打开在资源管理器地址栏前加上CMD路径管理员方式运行:选择以管理员方式运行常用的Dos命令#切换盘符:<目标盘符>:#查看当前目录下的所有文件:dir#切换目录:cd<目标路径>。例如:......
  • macos:安装homebrew( Homebrew 4.0.10-119 / macos 12.4)
    一,通过命令行安装:1,原版安装命令:会无法安装liuhongdi@liuhongdideMacBook-Propoem%/bin/bash-c"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"curl:(7)Failedtoconnecttoraw.githubusercontent.comport443after45ms:......