首页 > 编程语言 >终于找到了C++成员函数做函数指针的完美解决办法

终于找到了C++成员函数做函数指针的完美解决办法

时间:2023-05-12 19:34:26浏览次数:44  
标签:function 解决办法 template C++ Callback static func 函数指针 include

当然,这是转自别人的:https://www.codenong.com/19808054/

之前因为这个没少废精力啊,这里记一下,感谢外国友人的回答.

 1 #include <iostream>
 2 #include <functional>
 3 #include <string>
 4 #include <sstream>
 5 #include <memory>
 6 
 7 using namespace std;
 8 
 9 template <typename T>
10 struct Callback;
11 
12 template <typename Ret, typename... Params>
13 struct Callback<Ret(Params...)>
14 {
15     template <typename... Args>
16     static Ret callback(Args... args) { return func(args...); }
17     static function<Ret(Params...)> func;
18 };
19 
20 // Initialize the static member.
21 template <typename Ret, typename... Params>
22 function<Ret(Params...)> Callback<Ret(Params...)>::func;
23 
24 class Foo
25 {
26 public:
27     void print(int* x) { // Some member function.
28         cout << *x << endl;
29     }
30 };
31 
32 typedef  void (*cFunc)(int*);
33 
34 int main()
35 {
36     Foo foo; // Create instance of Foo.
37     // Store member function and the instance using bind.
38     Callback<void(int*)>::func = bind(&Foo::print, foo, placeholders::_1);
39 
40     // Convert callback-function to c-pointer.
41     cFunc c_func = static_cast<decltype(c_func)>(Callback<void(int*)>::callback);
42 
43     // Use in any way you wish.
44     unique_ptr<int> iptr{new int(5)};
45     c_func(iptr.get());
46 
47     int data = 10;
48     c_func(&data);
49 }

 

标签:function,解决办法,template,C++,Callback,static,func,函数指针,include
From: https://www.cnblogs.com/edenpei/p/17396117.html

相关文章

  • C++ 模板
     模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。每个容器都有一个单一的定义,比如 向量 ,我们可以定义许多不同类型的向量,比如 vector<in......
  • C++ 变量类型
    C++变量类型变量其实只不过是程序可操作的存储区的名称。C++中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不......
  • C++ 模板
    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。每个容器都有一个单一的定义,比如 向量 ,我们可以定义许多不同类型的向量,比如 vector<int> 或......
  • c++打卡练习(26)
    水仙花数:一个三位数,每个位上的数的三次方的和等于这个数本身,那么他就是水仙花数流程图:伪代码:源代码:#include<iostream>usingnamespacestd;intmain(){ intbai,shi,ge,i,j=0; for(i=100;i<1000;i++){ bai=i/100; shi=(i-bai*100)/10; ge=i-bai*100-shi*10; if(i==bai*ba......
  • C/C++思考:命令模式在控制中的应用
    目录意义问题用命令模式解决电机控制与输入信号耦合问题与标准命令模式的区别异同意义先说结论:命令模式能有效对代码模块进行解耦,增强模块的扩展性以及可移植性。问题为了方便说明问题,假设现在有一个电机Motor,在识别到外界信号后,通过软件控制其旋转。需要支持的旋转方式为3种:......
  • js小数运算出现的问题(精度丢失)及解决办法
    案例:项目中遇到的问题购物车结算时,商品价格(33.01)-优惠券价格(5),本应该是28.01,但是实际的结果是28.009999999999998本案例是在浏览器控制台里打印 出现的原因:原因其实就是js number类型运算都需要先将十进制转二进制但小数点后的位数转二进制会出现无限循环的问题,只能舍0......
  • java 的 JDK JRE , android 的 SDK NDK , native c++ 的概念
       ......
  • Auto_Position=1 主库清空部分binlog从库错误(1236)的解决办法
    环境:OS:Centos7DB:mysql5.7.291.从库同步错误如下:mysql>showslavestatus\G;***************************1.row***************************Slave_IO_State:Master_Host:192.168.1.104Master_User:repl......
  • 【C++之内联函数和模板】
    内联函数(inline):1.使用关键字inline修饰的函数叫做内联函数,内联函数可以提升程序运行效率。2.内联函数是一种用空间换取时间的方法,省去了调用函数的时间,会将函数代码拷贝过来占用空间,所以很长的代码不适合转变内联函数。3.如果定义为inline的函数体过大,编译器优化时会忽略掉内......
  • 使用golang编写支持C++调用的动态库,接口支持结构体和回调函数
    网上有很多例子介绍如何使用cgo实现C/C++与golang进行接口交互。我有个项目是使用Qt写的客户端程序,但Qt在需要使用redis、支持表单的web服务、mq或网络化日志库等需求时,往往需要加载一大堆第三方库,且编译复杂,跨平台(如Windows/linuxarm/linuxx86)编译时较为复杂。鉴于有使用go......