我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++中function的实现原理详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++中function的实现原理详解

前言

类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。

通常std::function是一个函数对象类,它包装其它任意的函数对象,被包装的函数对象具有类型为T1, …,TN的N个参数,并且返回一个可转换到R类型的值。std::function使用 模板转换构造函数接收被包装的函数对象;特别是,闭包类型可以隐式地转换为std::function

自己实现function

#include <iostream>
#include <string>
using namespace std;

template<typename T>
class MyFunction3 {

};

template<typename Ty, typename A1>
class MyFunction3<Ty(A1)> {

public:
	typedef Ty(*pFunction)(A1);//定义一个函数指针,指针指向的函数返回类型是Ty,有1个函数参数
	MyFunction3<Ty(A1)>(pFunction _pFunction) : _function(_pFunction) {
	}

	Ty operator()(A1 arg1) {
		return (*_function)(arg1);
	}

private:
	pFunction _function;
};


template<typename Ty,typename A1,typename A2>
class MyFunction3<Ty(A1,A2)> {

public:

	typedef Ty(*pFunction)(A1, A2);//定义一个函数指针,指针指向的函数返回类型是Ty,有两个函数参数
	MyFunction3<Ty(A1, A2)>(pFunction _pFunction):_function(_pFunction) {
	}
    
	Ty operator()(A1 arg1, A2 arg2) {
		return (*_function)(arg1, arg2);
	}

private:
	pFunction _function;
};


void showMes(string mes) {
	cout << "showMes(string mes)=" << mes << endl;
}


int sum1(int x, int y) {
	cout << "sum1 "<<(x+y) << endl;
	return x + y;
}
int sum2(int x, int y) {
	cout << "sum2 " << (x + y) << endl;
	return x + y;
}

int main() {

	MyFunction3<int(int, int)> f1(sum1);
	f1(20,30);


	MyFunction3<void(string)> f2(showMes);
	f2("AAAA");

	system("pause");
	return 0;
}

上面代码我们实现了两个模板的部分特例化

  • class MyFunction3<Ty(A1)> 一个函数参数的
  • class MyFunction3<Ty(A1,A2)> 两个函数参数的

所以问题来了...三个参数,四个参数,五个参数等若干个参数的怎么办?

可以使用C++11 可变参数类型, 具体如下

#include <iostream>
#include <string>
using namespace std;

template<typename T>
class MyFunction4 {

};


template<typename R , typename... A >
class MyFunction4<R(A...)> {

public:
	typedef R(*PFUNCTION)(A...);

	MyFunction4<R(A...)>(PFUNCTION _p) : function(_p) {}

	R operator()(A... arg) {
		return (*function)(arg...);
	}

private:

	PFUNCTION function;
};


void showMes1(string mes) {
	cout << "showMes(string mes)=" << mes << endl;
}

int sum11(int x, int y) {
	cout << "sum11 " << (x + y) << endl;
	return x + y;
}
int sum21(int x, int y) {
	cout << "sum21 " << (x + y) << endl;
	return x + y;
}

int main() {

	MyFunction4<int(int, int)> f1(sum11);
	f1(20, 30);


	MyFunction4<void(string)> f2(showMes1);
	f2("AAAA");

	system("pause");
	return 0;
}

到此这篇关于C++中function的实现原理详解的文章就介绍到这了,更多相关C++ function原理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++中function的实现原理详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++中function的实现原理详解

类模版std::function是一种通用、多态的函数封装。function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作。本文主要聊聊它的实现原理,需要的可以参考一下
2022-12-09

C++中内存池的简单原理及实现详解

内存池的思想是,在真正使用内存之前,预先申请分配一定数量、大小预设的内存块留作备用。本文主要来和大家聊聊内存池的简单原理及实现,希望对大家有所帮助
2023-03-01

详解C++虚函数中多态性的实现原理

C++是一种面向对象的编程语言,在C++中,虚函数是实现多态性的关键。本文就来探讨一下C++虚函数中多态性的实现原理及其在面向对象编程中的应用吧
2023-05-19

详解Android中Handler的实现原理

在 Android 中,只有主线程才能操作 UI,但是主线程不能进行耗时操作,否则会阻塞线程,产生 ANR 异常,所以常常把耗时操作放到其它子线程进行。如果在子线程中需要更新 UI,一般是通过 Handler 发送消息,主线程接受消息并且进
2022-06-06

JavaAQS的实现原理详解

这篇文章主要借助了ReentrantLock来带大家搞清楚AQS的实现原理,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
2023-05-14

详解Android中Handler的内部实现原理

本文主要是对Handler和消息循环的实现原理进行源码分析,如果不熟悉Handler可以参见博文《详解Android中Handler的使用方法》,里面对Android为何以引入Handler机制以及如何使用Handler做了讲解。 概括来说
2022-06-06

Python中Dict两种实现的原理详解

在Python中, Dict是一系列由键和值配对组成的元素的集合, 它是一个可变容器模型,可以存储任意类型对象。本文主要介绍了Dict两种实现的原理,感兴趣的可以了解一下
2023-03-01

详解IOS WebRTC的实现原理

目录概述P2P连接模式WebRTC的服务器与信令WebRTC的NAT/防火墙穿越技术概述 它在2011年5月开放了工程的源代码,在行业内得到了广泛的支持和应用,成为下一代视频通话的标准。 WebRTC的音视频通信是基于P2P,那么什么是P2
2022-05-15

详解Android中实现热更新的原理

这篇文章就来介绍一下Android中实现热更新的原理。 一、ClassLoader 我们知道Java在运行时加载对应的类是通过ClassLoader来实现的,ClassLoader本身是一个抽象来,Android中使用PathClassLo
2022-06-06

详解MD5算法的原理以及C#和JS的实现

MD5 是哈希算法(散列算法)的一种应用。这篇文章主要和大家介绍一下MD5算法的原理以及C#和JS的实现,文中的示例代码讲解详细,需要的可以参考一下
2023-03-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录