从std::function中抽离出函数指针类型

template <typename Function>
struct function_traits : public function_traits < decltype(&Function::operator()) >
{

};

template <typename ClassType, typename ReturnType, typename Args>
struct function_traits < ReturnType(ClassType::*)(Args) const >
{
typedef ReturnType(*pointer)(Args);
typedef std::function<ReturnType(Args)> function;
};

测试代码:

class A
{
public:
void Test(int aaaa)
{

}
};

A a;
std::function<void(int)> f = std::bind(&A::Test, a, std::placeholders::_1);
std::string name = typeid(function_traits<decltype(f)>::pointer).name();

时间: 2024-10-07 15:51:28

从std::function中抽离出函数指针类型的相关文章

如何从业务代码中抽离出可复用的微组件

背景 很多业务代码,掺杂着一些通用的大段逻辑:容易导致的后果是,当需要类似功能时,不得不重新写一道,或者复制出几乎相同的代码块,让系统的无序性蹭蹭蹭往上涨. 具有良好抽象思维的有心的开发者,则会仔细观察到这种现象,将这些通用的大块逻辑抽离出来,做成一个可复用的微组件,使得以后再做类似的事情,只需要付出很小的工作即可. 那么,如何从业务代码中抽离出可复用的微组件,使得一类事情只需要做一次,今后可以反复地复用呢? 本文将以一个例子来说明. 在业务开发中,常常需要根据一批 id 查到相对应的 name

【示例】C语言中利用数组存放函数指针

C语言中利用数组存放函数指针,增加函数使用的灵活性.使用时只需提供数组索引,即可调用不同函数. 预备知识: 1.指向函数的指针 一个函数在编译时被分配一个入口地址,这个地址就被称为函数的指针. 例如: int max(int,int); // 声明函数,比较两数大小 int (*p)(); //声明指向函数的指针变量 p=max; //将函数max的入口地址赋给指针变量p int c=(*p)(a,b); //调用函数 2.函数指针作为函数参数 该例子中每次给process函数不同实参(函数名)

用typedef定义函数指针类型(转)

typedef可以用于定义函数指针类型: [语法]typedef <返回类型> (*<函数类型名>)(参数表)typedef <返回类型> (<类名>::*<函数类型名>)(参数表) [用途]1.可以用来定义该函数类型的函数指针,就不用每次使用函数指针都要写一次函数原型了:2.有了类型名,就可以使用在容器里面,譬如map<int, 类型名>,用于实现灵活的函数调用. [示例] 例1:typedef void (*PF)(int x);

如何声明函数指针类型

函数指针就是指向函数的指针,可以用与函数指针类型对应的函数名赋值,可以用来调用函数.全局函数指针常用于回调(函数). 声明函数指针类型应根据其所指向的函数去声明. 例如声明函数 int fun(int i,float k); 的函数指针类型,只需仿照函数这样写 typedef int (*Pfun)(int i, float k); 如此便可定义该类型的函数指针变量 Pfun pfun = NULL;

使用typedef给函数指针类型一个别名

//使用typedef给函数指针类型一个别名 //typedef没有定义新的类型,给已经有的类型起一个别名,减少输入 typedef int(PADD)(int a, int b); //类型, PADD存储函数地址 typedef void(*MEG)(char s[]); void main() { PADD padd1 = add; //创建函数指针 printf("%d",padd1(11,23)); MEG meg1 = msg; meg1("心里的雨倾盆的下&qu

Scheme中lambda表达式与函数指针小例

SICP/Chapter2/Exercise-2.4 Lambda表达式语法 (lambda kw-formals body) 题目描述 用过程性表示方式重写序对的cons.car.cdr Scheme代码 (define (cons-24 x y) (lambda (m) (m x y))) (define (car-24 z) (z (lambda (p q) p))) 这段代码只有4行,但是逻辑关系并不好理解. 原因在于函数式语言的自顶向下实现方式不符合一般的逻辑习惯. lambda以类似

std::function赋值的几种方法

定义: #include <functional> std::function<void(const QString&)> myPrintFunction; 函数指针 void directPrint(const QString &msg){    qDebug()<<"direct print:"<<msg;} myPrintFunction = directPrint; lambda myPrintFunction =

C语言中的可变参数函数 三个点“…”printf( const char* format, ...)

第一篇 C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式: printf("%d",i); printf("%s",s); printf("the number is %d ,string is:%s",

1 函数指针详解

今天第一次发一下关于C++的文章,主要是最近做的项目要用到boost::asio作为网络库,而boost::asio要用到很多的boost::bind函数,而boost::bind又要用到自由函数指针和成员函数指针,所以这一串下来,我首先就是要讲讲函数指针这个东东. 一,自由函数指针 这个自由函数应该就是对应成员函数的那种不在类中的函数吧,英语叫做free function,我是硬翻的,欢迎同学们指正打脸.它的指针很容易写,分为两种方法吧: (一)先声明函数指针类型,再定义函数指针实例. 比如,