【几种可调动对象,Function和bind;线程的调动方式举例】

news2024/11/23 9:57:01

1.可调动对象的调动方式

方法 1、函数指针调动
方法2 、类类型的括号的重载 调动可调动对象

#include<iostream>
#include<functional>
using namespace std;
struct Foo
{
    void operator()(int x)
    {
        cout<<"Foo operator "<<x<<endl;
    }
};
struct Bar
{
    using Pfun =void (*) (int);Pfun成为一个类型
    static void func(int x)
    {
        cout<<"Bar func"<<x<<endl;
    }
    operator Pfun()const
    {
        return &Bar::func;
    }
};
struct Test
{
public:
    int x_;
    Test(int x):x_(x){

    }
public:
    void funb(){
            cout<<" Test funb"<<x_<<" ";
    }
    int func(int x)
    {
        x_= x;
        cout<<"Test func"<<x<<" ";
    }
};
int add(int x,int y)
{
    return x+y;
}
int main()
{
    int x=10;
    int *p = &x;
    方法调动1:通过函数指针
    void (*fp)(int) = Bar::func; 
    fp(x);
    方法调动2:通过对象重载
    Foo foo;  
    foo(x);方法调动2:重载实现调动
    Bar bar;
    return 0;
}

打印结果:

Bar func10
Foo operator 10


方法3、function

struct Test
{
public:
    int x_;
    Test(int x):x_(x){

    }
public:
    void funb(){
            cout<<" Test funb"<<x_<<" ";
    }
    int func(int x)
    {
        x_= x;
        cout<<"Test func"<<x<<" ";
        return x;
    }
};
int add(int x,int y)
{
    return x+y;
}
int main()
{
    std::function<int(int,int)>pfuna = add;
    auto val = pfuna(1,2);
    int x=10;
    Test test(10);  
    std::function<void(Test&)>pfunb =&Test::funb;
    pfunb(test);
    std::function<int(Test&,int )>pfunc = &Test::func;
    auto val1 = pfunc(test,100);有返回值,需要有值去接收
    cout<<val1<<endl;
    return 0;
}

打印结果:

Test funb10 Test func100 100

注意:<int(Test&,int )>尖括号中传入的是类型!


一个回调函数的例子:

/*function 一个回调函数的例子*/
class Test
{
    std::function<void()> callback;
public:
    Test(const std::function <void()>&f):callback(f){}
    void notify()
    {
        callback();
    }

};

class Foo
{
public:
    void operator()(void)
    {
        cout<<__FUNCTION__<<endl;
        cout<<__TIME__<<endl;
    }
};
int main()
{
    Foo foo;
    Test test(foo); 通过foo对象去激活foo中的仿函数 !
    test.notify();
    return  0;
}

可调动对象之--------
lamda表达式


2 .BIND与FUNCTION 示例:

/bind/
//作用1:将可调用对象与其参数一起绑定成一个仿函数
//作用2:将多元(参数个数为n,n>1) 可调用对象转成一元或(n-1)元,即只绑定部分参数

#include<iostream>
#include<functional>
using namespace std;
class Test
{
public:
    int val;
    Test(int x =0):val(x){}
    void output(int a,int b)
    {
        cout<<"a ="<<a<<"  b = "<<b<<"  val = "<<val<<endl;
    }

};
void output(int a,int b)
{
    cout<<"a ="<<a<<"  b = "<<b<<endl;
}
int main()
{   

    function<void(int ,int)>Function = output;
    auto pfun = std::bind(Function,10,20); 
    pfun();
    pfun(1,2); //此时的传入的参数并不起作用,因为绑定时已经给了固定的参数;
    auto pfuna = std::bind(Function,20); //error 格式中必须给两个参数
    auto pfunb = std::bind(Function,std::placeholders::_1,20);//第一个参数位给出占位符,
    //那么pfun(1,2)的第一个位置就被1占了;
    pfunb(1,2);
    Test test(10);
    auto pfunc = std::bind(&Test::output,test,std::placeholders::_1,placeholders::_2);
    //pfun;//没用调动可调动对象
    pfunc(1,2);
    ****************************************************************
    
    bind直接执行可调动对象:
    
    *括号内给值-> bind直接执行可调动对象*
    std::bind(&Test::output,test,std::placeholders::_1,placeholders::_2)(100,200); 
    ****************************************************************
    *function 加bind调动类对象成员方法*
    Test test1(10);
    std::function<void(Test&,int,int)>Function1 = &Test::output;
    std::bind(Function1,test1,placeholders::_1,placeholders::_2)(200,300);
    ****************************************************************
    *注意占位符和提取符的说法:*
    std::function<void(Test&,int,int)>Function2 = &Test::output;
    //std::bind(Function2,test1,placeholders::_1,placeholders::_3)(200,300);//error
     std::bind(Function2,test1,placeholders::_1,placeholders::_3)(100,200,300);//ok,第三个占位符可以提取到第三个参数

    
    return  0;

}

lamda表达式:

int main()
{   
    int x= 10,z=20;
    // auto val = [](int a)->int {
    //     return a+1;
    // };
    
    //cout<<val(1);
    // auto val = [=]() -> int{
    //     return x+10;
    // };
    // cout<<val(); //无参也要写括号  //reuslt::20

    auto val = [&]() ->int {
        x += 1000;
        return x;
    };
    cout<<"val = "<<val()<<endl;  //必须执行完VAL()后x的值才发生变化。
    cout<<"x = "<<x<<endl;
    /*无返回值的测试*/
    [&]() ->void {
        x += 1000;
    };
    cout<<"val = "<<val()<<endl;  
    cout<<"x = "<<x<<endl;
    cout<<"val = "<<val()<<endl;
    cout<<"x = "<<x<<endl;
    //带形参的测试:
    auto num = [x,&z](int y)->int {
        return x+(z++);
    };
    cout<<"num = "<<num(1)<<endl;
    cout<<z<<endl;
    //只引用形式捕获z,其他为隐式的以值捕获
    auto num1 = [=,&z](int y)->int{
        return x+(z++);
    };
    cout<<"num1 = "<<num1(1)<<endl;
    cout<<z<<endl;
    //只以值捕获z,其他为隐式的以引用捕获
    auto num2 = [&,z](int y)->int{
        cout<<"lamda"<<x<<endl;
        return (x++)+z;
    };
     cout<<"num2 = "<<num2(1)<<endl;
    cout<<"x"<<x<<endl;
    return 0;
}

在这里插入图片描述


线程的几种执行方式

1.thread的使用

    void funa(int x){cout<<"funa"<<endl;}
    void funb(int *p){cout<<"funb"<<endl;}  
    void func(int &x){cout<<"func"<<endl;
    x+=10;}
int main()
{   
    int x=10;
    int *p =&x;
    thread tha(funa,1);
    thread thb(funb,p);
    
    //thread thd(func,x); //error 函数无法以引用接收
    thread thc(func,std::ref(x)); //ok
    tha.join();
    thb.join();
    thc.join();
    //thd.join();
    cout<<x<<endl;
    return 0;

}

结果:

funa
funb
func
20

/利用using 定义函数指针/

void fun(int x,int y)
{   
    cout<<"nihao:fun"<<std::endl;
}
  using PFUN = void (*)(int , int);
  PFUN funt = fun; //ok
  std::thread thp(funt,2,2);//ok

3.线程调动类成员方法

typedef void (*pfun)();
using PFUN = void (*)(void);
class mythread
{
public:
    mythread(int val):val_(val)
    {}
    int val_;
public:
    void fun_thread(int val)
    {
        cout<<val_<<endl;
        cout<<val<<endl;
    }

};
int main()
{
 	mythread my1;
    std::thread thc(&mythread::fun_thread,&my1,100);
    thc.join();
    return 0;
}

4./线程函数是仿函数的例子/

/*线程函数是仿函数的例子*/
class Test
{
public:
    void operator()(int x,int y)
    {
        cout<<"add"<<x+y<<endl;
    }
    void add(int x,int y){
        cout<<"add 普通成员函数"<<x+y<<endl;
    }
};
int main()
{
    std::thread tha(Test{},1,2); //函数重载直接调动类的成员仿函数
    Test test;
    std::thread thb(&Test::add,&test,1,2); //调动成员函数
    thb.join();
    tha.join();
    return 0;
}

5./强转的例子/

class Test1
{
public:
int val = 190 ;
using PFUN = void (*)(int , int);
public:
static void add(int a,int b)
{
    int c=a+b;
    cout<<"add c"<<c<<endl;
}
operator PFUN()const
{
    return &add;
}
operator int()const
{
    return val;
}
};
int main()
{
    Test1 test1;
    int num =test1; //会调动重载的强转函数 operator int()
    test1(12,23); //result::add 35 .其实是下面的语句:
    //test.operator Test::PFUN()(12,23);
    
    return 0;
}

test1(12,23); 调动过程:
test1后面的括号代表调动其重载函数,12,23为add的参数匹配,最后调动ADD函数。


lamda:

int main()
{

   /*lamda*/
    std::thread thc([&](int x_) -> void {

        x += x_; //这里x要用就必须被捕获,注意不能被值捕获(这里值被修改)
    },100);
    std::thread thc([=]()->void {
        printf("lamda \n");
    });
    
    thc.join();
    cout<<num<<endl;// 110
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS3【定位的基本使用[静态定位\相对定位\绝对定位]、子绝父相、固定定位、元素的层级关系】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、定位1.1定位的基本介绍1.1.1 网页常见布局方式1.1.2 定位的常见应用场景1.2 定位的基本使用1.2.1 定位初体验1.2.2 使用定位的步骤1.2.3 静态定位1.2.4 小结1.2.…

使用 Docker Hub 完美地存储 Helm 图表实战

使用 Docker Hub 完美地存储 Helm 图表实战 Helm 是 Kubernetes 的包管理器。它是一个开源容器编排系统。它通过提供一种简单的方法来定义、安装和升级复杂的 Kubernetes 应用程序&#xff0c;帮助您管理 Kubernetes 应用程序。 使用 Helm&#xff0c;您可以将您的应用程序打包…

git教程

教程目录Git 教程Git 与 SVN 区别Git 与 SVN 区别点&#xff1a;Git 安装配置Linux 平台上安装Debian/UbuntuCentos/RedHatWindows 平台上安装Mac 平台上安装Git 配置用户信息文本编辑器##差异分析工具查看配置信息Git 工作流程Git 工作区、暂存区和版本库基本概念Git 创建仓库…

semargl 软件使用方法简介

文章目录前言一、semargl 软件使用简介1.semargl 软件简介2.准备演示软件操作所需的数据3.使用 semargl 获取频谱关系4.使用 semargl 获取特定频率模式的空间分布5.使用 semargl 获取自旋波的色散关系二、笔记05第三节内容的补充1.优化多进程读取磁化数据文件的代码2.新增获取特…

【JavaSE】 常用类(447~515)

String 447.常用类-每天一考 1.画图说明线程的生命周期&#xff0c;以及各状态切换使用到的方法等 状态&#xff0c;方法 2.同步代码块中涉及到同步监视器和共享数据&#xff0c;谈谈你对同步监视器和共享数据的理解&#xff0c;以及注意点。 synchronized(同步监视器){//操…

Python手势识别与追踪

程序示例精选 Python手势识别与追踪 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<Python手势识别与追踪>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 应…

【日常】圣诞节、颜色⛄

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 关于圣诞节&#x1f384;&#xff0c;大家想到什么颜色&#xff1f;⛄&#x1f98c;&#x1f381;&#x1f385;&#x1f525; demo online - https://codepen.io/adamlindqvist/pen/EaPeJg html <!-- Christ…

详细介绍关于自定义类型:结构体、枚举、联合【c语言】

文章目录结构体结构体的声名特殊的声明结构成员的类型结构的自引用结构体变量的定义和初始化结构体内存对齐修改默认对齐数结构体变量访问成员结构体传参结构体实现位段&#xff08;位段的填充&可移植性&#xff09;位段的内存分配位段的跨平台问题枚举枚举类型的定义枚举的…

【Linux】用户与用户组操作_补

文章目录一.用户1.1 用户与用户组概念1.2 与用户管理相关的系统文件1.3 查看用户组1.3.1用户组密码配置文件&#xff0f;etc&#xff0f;gshadow1.4用户管理创建用户修改用户添加密码一.用户 1.1 用户与用户组概念 用户和用户组的对应关系有&#xff1a;一对一、一对多、多对一…

【C语言进阶】指针练习题

写在前面 这是指有关指针的小题 正文 练习一 int main() {int a[5][5];int (*p)[4];pa;printf("%p,%d", &p[4][2]-&a[4][2], &p[4][2]-&a[4][2] );return 0; } 解析&#xff1a; a[4][2]为如图粉色部分&#xff0c;p[4][2]为如图蓝色部分。a的…

【ROS通信机制实战练习】通过话题发布实现turtlesim小乌龟圆周运动

本节记录下使用ROS中的话题机制&#xff0c;实现turtlesim中小乌龟的圆周运动。 如果想通过话题通信机制&#xff0c;实现小乌龟的圆周运动&#xff0c;需要首先明确小乌龟的运动情况&#xff0c;以及所涉及的指挥运动的参数&#xff0c;这里需要首先手动发布一个turtlesim的节…

springboot整合mybatis代码快速生成

特别说明&#xff1a;本次项目整合基于idea进行的&#xff0c;如果使用Eclipse可能操作会略有不同&#xff0c;不过总的来说不影响。 springboot整合之如何选择版本及项目搭建 springboot整合之版本号统一管理 springboot整合mybatis-plusdurid数据库连接池 springboot整合…

String 字符串

String 基本介绍 String 应该是 Java 中最常用的一个对象&#xff0c;他不是八种基本数据类型的其中之一&#xff0c;但是随便翻了一下项目代码&#xff0c;用 String 定义的变量超过百分之八十。 public final class Stringimplements java.io.Serializable, Comparable<…

VUE3-计算属性和监听器《五》

目录 一&#xff0c;计算属性 二&#xff0c;监听器 在vue3种&#xff0c;当界面上需要处理一些数据的时候&#xff0c;可以通过计算属性和监听器处理&#xff0c;他们都是对一个属性进行操作的&#xff0c;然后返回数据。 他们的区别是&#xff0c;计算属性&#xff0c;是通…

20221226英语学习

今日短文 When we are shown two options, our eyes tend to flick from one to the other and back again several times as we deliberate on the pros and cons of each. Researchers at Johns Hopkins University in the US have found that the speed with which our ey…

Hbase是什么?

Hadoop Database简介表结构数据只能读不能改>生成新版本总结简介 永远的百度百科 HBase是一个分布式的、面向列的开源数据库&#xff0c;一个结构化数据的分布式存储系统”。 HBase不同于一般的关系数据库&#xff0c;它是一个适合于非结构化数据存储的数据库。另一个不同的…

过年首秀 - 用python写一个自动生成春联的软件并打包exe

前言 哈喽啊&#xff0c;我亲爱的铁铁们&#xff0c;I am back &#xff01;&#xff01; 别管&#xff0c;我也是阳过的人了&#xff0c;这么久都没有更新&#xff0c;今天就带来个小玩意吧 这不是过完圣诞就要过年了吗 这不得准备准备&#xff0c;春节的表演&#xff1f;…

excel数据处理技巧:组合函数统计产品批号

这是一个看似普通的编号问题&#xff0c;可竟然动用了TEXT和SUMPRODUCT两个重量级的函数共同出手才得以解决。以往遇到的编号问题&#xff0c;大多数都是COUNTIF的拿手好戏&#xff0c;但是今天这个问题COUNTIF完全插不上手&#xff0c;来看看模拟的数据吧。 如图所示&#xff…

「 理财与风险控制|养老系列」你想象中的高端养老社区是什么样?

本文主要介绍为什么养老规划需要考虑养老社区的部分&#xff0c;当前市场上养老社区的各种现状&#xff0c;养老社区从各个角度分类&#xff0c;选择养老社区需要关注的要素以及保险保单能够提供的养老权益是怎样的 文章目录01 为什么要关注养老社区&#xff1f;02 为什么关注高…

QT多窗口编程与文件IO编程

目录 一、消息对话框 QMessageBox&#xff08;掌握&#xff09; 二、常用窗口类&#xff08;掌握&#xff09; 三、主窗口类 QMainWindow&#xff08;重点&#xff09; 四、parent参数&#xff08;掌握&#xff09; 五、窗口传参 5.1 成员函数/构造函数 5.2 信号槽传参 六、事件…