【c++修行之路】c++11新特性--下

news/2025/2/26 4:44:29

c++11新特性下

  • 一、前言
  • 二、包装器
    • 2.1包装器统一了接口
    • 2.2使用包装的思想设计包装函数
  • 三、绑定(bind)
    • 3.1调整参数顺序
    • 3.2调整参数个数
  • 四、结语

一、前言

大家好久不见,今天我们继续来学习c++11的新特性。

二、包装器

先来看一段代码:

#include <iostream>

using namespace std;

class sub
{
public:
	int operator()(int x, int y)
	{
		return x - y;
	}
};

int add(int x, int y)
{
	return x + y;
}

int main()
{
	//函数指针:		1+2=3
	int(*fp)(int, int);
	fp = add;
	cout << fp(1, 2) << endl;

	//仿函数:			4-2=2
	sub s;
	cout << s(4,2) << endl;

	//lambda表达式:	3*3=9
	auto mul = [](int a, int b) -> int {
		return a * b;
	};
	cout << mul(3, 3) << endl;

	
	return 0;
}

在这段代码里,我分别使用了函数指针、仿函数、lambda表达式来表示加法,减法和乘法的运算,我们知道在C++中存在函数指针、仿函数和lambda表达式等多种方式来表示和使用函数,为什么还要费心费力地搞一个包装器出来呢,以下是我的个人理解:

2.1包装器统一了接口

假如我要将上述的三种运算保存在一个map里,你会发现这面临着重重困难,首先函数指针的类型及其复杂,再者三种运算都使用不同的方式实现,无法统一,也无法保证未来不使用新的方式实现,而包装器可以同时接收函数指针、仿函数、lambda表达式,调用时可以做到统一。

参考代码:

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

class sub
{
public:
	int operator()(int x, int y)
	{
		return x - y;
	}
};

int add(int x, int y)
{
	return x + y;
}

int main()
{
	map<string, function<int(int, int)>> opration_map;
	opration_map =
	{
		{"+",add},
		{"-",sub()},
		{"*",[](int x,int y)->int {return x * y;} }
	};
	cout << opration_map["+"](2, 2) << endl; //4
	cout << opration_map["-"](2, 2) << endl; //0
	cout << opration_map["*"](2, 2) << endl; //4
}

2.2使用包装的思想设计包装函数

有了包装的思想,我们可以设计一个包装函数,可以统一管理和调用参数不一致、名称不一样的函数,当然也可以使用类似的思路设计对应的包装类。


#include <iostream>
#include <functional>

void internet_service(string ip,int port) 
{
    std::cout << "启动网络服务" << std::endl;
    std::cout << "ip为:"  << ip <<std::endl;
    std::cout << "端口号为:" << port <<std::endl;
}

void process_service(int id) {
    std::cout << "启动进程" << std::endl;
    std::cout << "进程id:" << id <<std::endl;
}

// 统一接口的包装器函数
template<typename Func, typename... Args>
void execute(Func func, Args... args) 
{
    cout << "正在统一记录日志" << endl;
    func(args...); // 调用原始函数
    cout << "正在进行统一清理工作" << endl;
}

int main() 
{
    // 统一调用不同类型的函数
    execute(internet_service, "127.0.0.1",8080); 
    execute(process_service,114514);

    return 0;
}

三、绑定(bind)

3.1调整参数顺序

使用bind可以调整函数的参数顺序,实例如下:

void Print(int x,int y)
{
	cout << "第一个参数:" << x << endl;
	cout << "第二个参数:" << y << endl;
}

int main()
{
	bind(Print, placeholders::_1, placeholders::_2)(1, 2);
	bind(Print, placeholders::_2, placeholders::_1)(1, 2);

	return 0;
}

3.2调整参数个数

我们知道类中的函数默认会带一个参数:this指针,这就会给我们的包装器带来诸多麻烦,因为又要去解决类型不一致的问题,恰巧bind能够帮助我们解决这个问题:

class sub
{
public:
	int func(int x, int y)
	{
		return x - y;
	}
};

int main()
{
	sub s;
	function<int(sub,int, int)> fsub1 = &sub::func;
	function<int(int, int)> fsub2 = bind(&sub::func, sub(), placeholders::_1, placeholders::_2);
	function<int(int, int)> fsub3 = bind(&sub::func, &s, placeholders::_1, placeholders::_2);

	cout << fsub1(sub(), 2, 1) << endl;
	cout << fsub2(2, 1) << endl;
	cout << fsub3(2, 1) << endl;
	return 0;
}

可以看到bind将第一个参数写死来减少实际需要我们传递的参数个数,可以看到使用bind无论是匿名对象还是实例指针都是可以成功绑定的,但第一种我们在调用的时候只能传递类的对象,因此更推荐第二种方式。

四、结语

到这里,关于c++11新特性的相关讲解就告一段落了,两篇文章间隔较长,主要是中间去做课设了,不过好在课设拿了95分,也算没白浪费时间,接下来会持续更新c++和Linux以及MySQL的相关知识,我们下期再见!


http://www.niftyadmin.cn/n/1851408.html

相关文章

bash脚本的编写

开发语言有编译语言如C、C等需要编译后才能执行。也有bash、perl、python、PHP、ruby等需要解析执行的语言linux系统中脚本的编写现在很多都是用bash编写的。bash 是sh的GNU增强版&#xff0c;是一种弱类型语言&#xff0c;默认情况下变量类型为字符型而且变量不用声明和检查。…

Visual Studio Code for mac 设置中文

mac系统VScode设置中文 macOS 快捷键&#xff1a;command shift p输入搜索 configure language如图&#xff1a; 选择zh-cn&#xff1a; 选择后重启即可&#xff1a; 如果没有中文选项&#xff0c;则需要安装&#xff0c;如图&#xff1a; 需要什么语言安装即可。 转载于:htt…

开机黑屏的一般解决方法

一、如果没有电力供应检查PC电源电源接口和电源线通电情况1.检查机箱电源的接口和电源线&#xff0c;是否完好。如果接口和电源线有破损断裂的应当及时更换。2.检查主板电源线插口。如果没有破损&#xff0c;就将插口拔出再插入。一般可以解决&#xff0c;由于主板接触不良导致…

测试LIVE WRITER

测试客户端。LIVE WRITER!转载于:https://blog.51cto.com/samsong/350660

爬虫 爬取妹子图

功能写的很差&#xff0c;简单练手 #!/usr/bin/env python # -*- coding:utf-8 -*-import hashlib import re import timeimport requests # pip3 install requestsmovie_path rD:\爬虫学习\爬虫\妹子图def get_index_page(url):try:# 模拟发送get请求response requests.get…

【luogu2858】 [USACO06FEB]奶牛零食Treats for the Cows [动态规划 区间dp]

P2858 [USACO06FEB]奶牛零食Treats for the Cows 我们可以从最后往外推 当前状态就只由上一个状态决定 就是合唱队那道题改一下 1 #include<iostream>2 #include<cstdio>3 #include<queue>4 #include<cstring>5 #include<cmath>6 #include<st…

Asp.net mvc 2中使用Ajax的三种方式

作者: 麒麟 发表于 2010-07-18 19:58 原文链接 阅读: 631 评论: 9在Asp.net MVC中&#xff0c;我们能非常方便的使用Ajax。这篇文章将介绍三种Ajax使用的方式&#xff0c;分别为原始的Ajax调用、Jquery、Ajax Helper。 首先看一下原始的Ajax的调用的 在Asp.net MVC中添加一个cu…

CSS中@support的用法

这段时间一直在调试浏览器的兼容性问题&#xff0c;了解到了support的这个属性&#xff0c;记录下&#xff1a; CSS中的support主要是用于检测浏览器是否支持CSS的某个属性&#xff0c;其实就是条件判断&#xff0c;如果支持某个属性&#xff0c;你可以写一套样式&#xff0c;如…