首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

每日一问:c++成员函数,能作为线程参数吗?

问:成员函数可以传入线程参数吗? 回答: 如果c语言全局函数,可以。 如果是静态成员函数,可以 如果是普通成员函数,不可以 为什么?...《深入探索C++对象模型》中提到成员函数时,当成员函数不是静态,虚函数,那么我们有以下结论: (1) &名::函数名 获取成员函数实际地址; (2) 对于函数x来讲obj.x()编译器转化后表现为...x(&obj),&obj作为this指针传入; (3) 无法通过强制类型转换在成员函数指针与其外形几乎一样普通函数指针之间进行有效转换。...所以,要在回调函数中传入一个普通成员函数时,this指针无处安放使得回调函数比较复杂。 怎么解决?...} public: bool startThread() {//启动子线程 typedef void* (*FUNC)(void*);//定义FUNC类型是一个指向函数指针

2.2K30
您找到你想要的搜索结果了吗?
是的
没有找到

C++可调用Callable类型总结

同时, 对于成员函数指针和数据成员指针, t1 可以是一个常规指针或一个重载了 operator* 对象, 例如智能指针 std::unique_ptr 或 std::shared_ptr....可作为参数标准库 下列标准库设施接受任何可调用(Callable)类型: 库 说明 function(C++11) 包装具有指定函数调用签名任意_可复制构造类型_可调用对象 (模板) bind(...引用包装器 (模板) result_of (C++11)(C++20 中移除) invoke_result(C++17) 推导以一组实参调用一个可调用对象结果类型 (模板) thread (构造函数...) 构造新 thread 对象 (std::thread 公开成员函数) call_once(C++11) 仅调用函数一次, 即使从多个线程调用 (函数模板) async(C++11) 异步运行一个函数...(有可能在新线程中执行),并返回保有其结果 std::future(函数模板) packaged_task(C++11) 打包一个函数, 存储其返回值以进行异步获取 (模板) 一些典型 Callable

23120

UNIX(多线程):08---线程传参详解,detach()陷阱,成员函数线程函数

线程传参详解,detach()陷阱,成员函数线程函数 传递临时对象作为线程参数 【引例】 #include #include #include <thread...也就是说,不同线程,它线程id(数字)必然是不同。 线程id可以用c++标准库里函数来获取。通过 std::this_thread::get_id() 来获取。...在子线程中多执行了一次拷贝构造函数,所以建议在作为参数传递时,使用引用方式传递(虽然写是引用方式,但是实际上是按值拷贝方式处理)。...传递对象、智能指针作为线程参数 在线程中修改变量值不会影响到主线程。 将A成员变量m_i改成mutable。...> using namespace std; class A { public: int m_i; //类型转换构造函数,可以把一个int转换为A对象 A(int i) :m_i(i) { cout

78020

面向对象编程风格 VS 基于对象编程风格(boost::bindfunction)

void *(*start_routine) (void *), void *arg); start_routine 参数是一般函数指针,故不能直接将run() 作为此参数,因为run()是成员函数,...隐含this指针,故实现一个静态成员函数ThreadRoutine(), 在里面调用run(),此外参数arg 我们传递this指针,在ThreadRoutine()内将派生指针转换为指针来调用run...我们既可以绑定一般全局函数,也可以绑定其他里面的成员函数,操作很方便。...假设TcpServer是一个网络库,如何使用它呢?那要看它是如何实现C编程风格:注册三个全局函数到网络库,网络库函数参数有函数指针类型,里面通过函数指针来回调。...基于对象风格:用一个EchoServer包含一个TcpServer(具体)对象成员server,在构造函数中用boost::bind 来注册三个成员函数,如server.SetConnectionCallback

1.4K00

function和bind

,它可以将一个类型对象转换为另一种类型,这里operator tfpoint() 是将一个T2对象转为一个函数指针类型,所以tc2(50)调用了由类型转换函数返回函数指针,并将参数50传给了他...,绑定完后可以直接调用,也可以用std::function进行保存,再需要调用 格式std::bind(待绑定函数对象/函数指针/成员函数指针,参数绑定值1,参数绑定值2…参数绑定值n) 总结:...placeholders::_1, std::placeholders::_2);里面的第二个参数ct,会导致调用CT拷贝构造函数来生成一个CT类型临时对象,作为std::bind返回值(bind...int main() { auto rt = std::bind(CT()); } CT()是构造临时对象,然后又调用了拷贝构造函数生成了一个可调用对象,作为std::bind返回内容 bind返回仿函数类型对象...思想:所谓延迟调用,将可调用对象统一格式,保存起来,需要时候再调用 b)我们有std::function绑定一个可调用对象,类型成员不能绑。

8910

C++11新特性学习笔记

++枚举类型有一些缺点:它会在一个代码区间中抛出枚举类型成员(如果在相同代码域中两个枚举类型具有相同名字枚举成员,这会导致命名冲突),它们会被隐式转换为整型,并且不可以指定枚举底层数据类型。...4.4.1 “=default”函数 C++ 有四特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。...这些特殊成员函数负责创建、初始化、销毁,或者拷贝类对象。如果程序员没有显式地为一个定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式为这个生成一个默认特殊成员函数。...类似的,手动编写特殊成员函数代码执行效率比编译器自动生成特殊成员函数低。 C++11 标准引入了一个新特性:”=default”函数。...\n”; return 0; } 如果不希望线程被阻塞执行,可以调用线程std::thread::detach,将线程线程对象分离,让线程作为后台线程去执行。

2K20

C++11新特性学习笔记

++枚举类型有一些缺点:它会在一个代码区间中抛出枚举类型成员(如果在相同代码域中两个枚举类型具有相同名字枚举成员,这会导致命名冲突),它们会被隐式转换为整型,并且不可以指定枚举底层数据类型。...4.4.1 “=default”函数 C++ 有四特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。...这些特殊成员函数负责创建、初始化、销毁,或者拷贝类对象。如果程序员没有显式地为一个定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式为这个生成一个默认特殊成员函数。...类似的,手动编写特殊成员函数代码执行效率比编译器自动生成特殊成员函数低。 C++11 标准引入了一个新特性:”=default”函数。...\n”; return 0; } 如果不希望线程被阻塞执行,可以调用线程std::thread::detach,将线程线程对象分离,让线程作为后台线程去执行。

2.2K20

【Example】C++ 回调函数std::function 与 std::bind

二、std::function 与 std::bind 上面演示了最简单回调函数创建及使用,然而,上面的代码却出现了一个局限性,就是: 如果需要去回调一个成员函数函数指针则无法指向成员函数。...它本身作为延迟计算思想一种实现,作为一个调用过程当中转发者而存在,返回一个 std::function 对象。...首先,不规范解释是,function 作用是包装,它可以包装成员函数,但却无法生成成员函数可调用对象。而 std::bind 则是可以生成。...因此,function 与 bind 结合后,便成为了 C++ 中成员函数作为回调函数一种规范实现方式。...当用作成员函数绑定时,第一个参数仍然是作为成员可调用对象引用,第二个参数则是对象指针,而第三个参数开始对应可调用对象参数表。

4.3K30

C++11-lambda表达式包装器线程

对于每一个Lambda,编译器创建匿名,并定义相应数据成员存储Lambda捕获变量。没有捕获变量Lambda不包含任何含成员变量。...,完全就是按照函数对象方式处理 二、包装器 1、function包装器 概念: function包装器也叫作适配器,C++中function本质是一个模板,也是一个包装器 由于C++历史遗留问题...概念: std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可调用对象(callable object),生成一个可调用对象来“适应”原对象参数列表...//函数绑定 //成员函数必须通过对象或者指针调用,因此在bind时,bind一个参数位置来指定一个实列、指针或引用。...如果是成员函数作为线程参数时,必须将this作为线程函数参数 示例: #include #include using namespace std; class

1.1K30

C++编程经验(11):std::function 和 bind绑定器

文章目录 简介 std::function 可调用对象 std::bind std::placeholders 简介 在前面C++集群项目里面大量应用到了绑定器来做解耦操作,那么,绑定器到底是什么呢...有什么玄妙地方嘞? 其实也不是很玄乎,以前写Qt时候就经常用到绑定,昨天又发现,其实我们一直在用绑定器却不自知,比如说创建线程,将函数指针与它参数一并传入。...可调用对象 在C++中,有“可调用对象”这么个概念: 函数指针; 具有operator()成员函数对象(仿函数); 可以被转换为函数指针对象; 成员函数)指针。...---- std::function是一个可调用对象包装器,一个模板,可以容纳除了成员函数)指针之外所用可调用对象,通过指它模板参数,可以以统一方式处理函数函数对象、函数指针,并允许保存或者延迟执行...std::function fb1 = func1; fb1(); //绑定一个静态成员函数 std::function

1.2K10

C++航海王:追寻罗杰编程之路】C++11(四)

函数对象将rate作为成员变量,在定义对象时给出初始值即可,lambda表达式通过捕捉列表可以直接将该变量捕捉到。...C++中function本质是一个模板,也是一个包装器。...std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可调用对象(callable object),生成一个可调用对象来“适应”原对象参数列表。...C++11中线程 函数名 功能 thread() 构造一个线程对象,没有关联任何线程函数,即没有启动任何线程 thread(fn, args1, args2, ……) 构造一个线程对象,并关联线程函数...注意: 如果是成员函数作为线程参数时,必须将this作为线程函数参数。

11610

C++11简单介绍(下)

大家记住,空仿函数大小就是一个字节,空lambda表达式也是,因为仿函数没有成员变量,故大小为一个字节,我们在上面也提到了lambda表达式会被识别为仿函数对象!...函数对象将rate作为成员变量,在定义对象时给出初始值即可,lambda表达式通过捕获列表可以直接将该变量捕获到。...std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可调用对象(callable object),生成一个可调用对象来“适应”原对象参数列表。...endl; return 0; } get_id()返回值类型为id类型,id类型实际为std::thread命名空间下封装一个,该类中包含了一个结构体 当创建一个线程对象后,并且给线程关联线程函数...t3.join(); cout << a << endl; return 0; } 注意:如果是成员函数作为线程参数时,必须将this作为线程函数参数。

8110

【计算机网络】序列化与反序列化

,返回 -1 想要使用bind函数,就需要先创建一个网络通信类型变量,通过该变量存储端口号 IP地址 16位地址类型 所以要先定义一个 struct sockaddr_in(网络通信) 类型 变量...服务器实现 ——TcpServer.hpp 使用Sock这个,实例化对象_listensock 初始化 在初始化中,使用_listensock这个对象 去访问 Scok中实现过 Socket Bind...Listen 等函数 启动 作为一款服务器,就需要一直运行 作数据分析 通过_listensock对象访问Accept函数获取客户端IP地址和端口号 多线程使用 在函数如果不加static...,new对象,将sock clientip client port 与this指针传递过去作为参数 完成构造 再将td传过去作为回调函数参数 在回调函数内部调用 serviceIO函数 来完成协议 3...使用空格连接起来 Request自定义反序列化 提供一个函数StringSplit ,去掉字符串中空格,分别填入vector数组中,作为vetcor数组中元素 下标为0开始位置 填入_x ,下标为

17710

网络编程『简易TCP网络程序』

参数 返回值:连接成功返回一个用于通信 socket 套接字(文件描述符),失败返回 -1 这也就意味着之前我们在 TcpServer 中创建成员 sock_ 并非是用于通信,而是专注于处理连接请求...Service() 业务处理函数能力,单凭一个 void* 参数是无法解决,为此可以创建一个,里面可以包含我们所需要参数 ThreadData — 位于 server.hpp 服务器头文件中...(十个) 当然可以支持多客户端同时通信 看似程序已经很完善了,其实隐含着一个大问题:当前线程池中线程,本质上是在回调一个 while(true) 死循环函数,当连接客户端大于线程池中最大线程数时,...,利于排查问题 所以接下来我们将会实现一个简易版日志器,用于定向输出我们日志信息 4.2.可变参数 日志需要我们指定格式并输出,依赖于可变参数 在编写简易版日志器之前,需要先认识一下 C语言 中有关可变参数使用...) 如何将一个 后台进程 变成 前台进程?

26710

C++编程经验(12):C++11新特性

详情C++编程经验(9):智能指针 – 裸指针管得了我要管,裸指针管不了我更要管!...C++编程经验(11):std::function 和 bind绑定器,虽然在这一篇里面专门讲过了,但是感觉有点抽象,重新捋一下,不然我也不长记性呐。...C++11为了解决这个问题,提供了std::move()方法来将左值转换为右值,从而方便应用移动语义。move是将对象状态或者所有权从一个对象转移到另一个对象,只是转义,没有内存拷贝。...初始化构造函数,创建一个 std::thread 对象,该 std::thread 对象可被 joinable,新产生线程会调用 fn 函数,该函数参数由 args 给出。...容器emplace成员 emplace操作是C++11新特性,新引入三个成员emplace_front、emplace 和 emplace_back。

96320

实现数据库连接池-后传

C++中,可以通过以下方式实现单例模式: 将构造函数、拷贝构造函数和赋值运算符声明为私有,以防止外部创建实例或复制实例。 在中定义一个静态私有成员变量,用来存储唯一实例。...使用这些函数,可以在 C++ 程序中创建和管理多个线程 下面是一个简单示例,演示如何在 C++ 中创建和使用多个线程: #include #include ...,这是不确定 6.lambda lambda 函数C++11 引入一种新特性,它允许你定义一个匿名函数对象,可以用来作为参数传递给其他函数或算法。...,我们使用 std::bind成员函数 Foo::print 与对象 &foo 绑定在一起,并使用占位符 _1 表示第一个参数。...它使用 std::bind成员函数 ConnectionPool::produceConnectionTask 与对象 this 绑定在一起,生成一个可调用对象。

7510

C++ Boost 异步网络编程基础

Boost库为C++提供了强大支持,尤其在多线程和网络编程方面。其中,Boost.Asio库是一个基于前摄器设计模式库,用于实现高并发和网络相关开发。...它接受一个回调函数作为参数,该回调函数将在定时器到期时被调用。...与之前版本相比主要不同点: 引入: 引入了 print ,将定时器和计数器等相关操作封装到了一个中,提高了代码封装性和可读性。...成员函数 run_print: 使用了成员函数 run_print 作为定时器回调函数,无需再使用 boost::bind 绑定 this 指针,直接使用成员变量,提高了代码简洁性。...// 在析构中打印结果 ~print() { std::cout << "循环已跳出,总循环次数: " << count_ << std::endl; } // 作为成员函数

42610

C++】C++11 新特性

function 定义格式如下: std::function f; function 使用方式类似于普通,可以先定义一个 function 对象...endl; return 0; } 需要特别注意是:当 function 封装成员函数时,我们需要对该成员函数进行声明,并且还需要在域前面加一个取地址符,另外,成员函数又分为静态成员函数和非静态成员函数...: 静态成员函数没有 this 指针,所以 function 实例化时不需要添加一个成员函数所属类型参数,在调用时也不需要传递一个成员函数所属对象; 但非静态成员函数有隐藏 this 指针...bind 格式如下: bind(函数指针或可调用对象, 参数1, 参数2, ...)...---- 十三、线程库 和智能指针、右值引用和移动语义一样,线程库我们也作为单独一篇博客进行学习。 ----

1.3K10
领券