在C++11之前,要实现函数对象或者仿函数,主要参考《C++设计新思维》中的Loki库,它采用模板推导的方式来实现。虽然Loki可以模拟函数对象,但其代码看起来比较晦涩,使用又不方便。在C++11以后,开始原生支持函数对象,新标准中的用法简单清晰,所有的可调用对象有了统一的调用方式,极易上手。本文总结函数对象的各种使用方法。

std::function的定义

1
2
3
#include <functional>
template< class R, class... Args >
class function<R(Args...)>; // R表示返回值,Args表示函数参数

类模板std::function是通用多态函数封装器。std::function的实例能存储、复制及调用任何可调用目标,包括函数、lambda表达式、bind表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。
存储的可调用对象被称为std::function的目标。若 std::function不含目标,则称它为空。调用空std::function的目标导致抛出std::bad_function_call异常。

阅读全文 »

使用背景

在多线程编程环境中,我们有时希望某个操作只做一次,比如获取一些系统变量;或者某个函数只被调用一次。我们就可以采用系统提供的std::call_once来保证。

我们再看下call_once的定义:

1
2
template< class Callable, class... Args >
void call_once( std::once_flag& flag, Callable&& f, Args&&... args );
阅读全文 »

本文记录现代C++使用到的图书以及相关网站。

0x01 相关网站

阅读全文 »

隐式类型转换带来的问题

我们首先看下面的这个例子,它可编译也可执行,最终结果是“TDemo::print 55”。有理由推断,实例化一个对象时,编译器自动将55这个整数转换成了“class TDemo”。类TDemo定义了一个单参数构造函数,而C++标准中,“单参数构造函数,可以完成从形参到该类型的一个隐式转换”,所以编译器能够完成从int类型到TDemo的类型转换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>

class TDemo
{
public:
TDemo(int num);
void print() const
{
std::cout << "TDemo::print "<< i_num << std::endl;
}

private:
int i_num;
};

TDemo(int num):i_num(num){}

int main()
{
TDemo demo = 55;
demo.print();

return 0;
}
阅读全文 »

C++继承机制的相关知识点

继承机制,就是利用已有的数据类型来定义新的数据类型,新数据类型将拥有基类的成员。派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。

单继承语法:

1
2
3
4
class <派生类名称>:<继承方式><基类名>
{
//派生类新定义成员
};

多继承语法:

1
2
3
4
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,......
{
//派生类新定义成员
};
阅读全文 »

C++ Primer的强烈建议

强制类型转换关闭或挂起了正常的类型检查。强烈建议避免使用强制类型转换,不依赖类型转换也能写出很好的C++程序。

这个建议在如何看待 reinterpret_cast 的使用时非常重要。此类强制转换总是非常危险的。相似地,使用价格const_cast也总是预示着设计权限。设计合理的系统应不需要使用强制转换抛弃const特性。其他的强制转换,如static_cast和dynamic_cast,各有各的用途,但都不应频繁使用。每次使用强制转换前,程序员应该仔细考虑是否还有其他不同的方法可以达到同一目的。如果非强制转换不可,则应限制强制转换值的作用域,并且记录所有假定涉及的类型,这样能减少错误发生的机会。

阅读全文 »

导语:C++中用“虚”的来命名的概念,涉及:

  • 虚函数
  • 虚析构函数
  • 纯虚函数
  • 虚基类

本文简要的说明下在面临什么样的问题下使用相应的技术、这些概念又是如何解决问题的。

阅读全文 »

基础图书

书名 ISBN 作者 出版社 出版日期 备注
C++ Primer 中文版 第5版 9787121155352 [美]李普曼 电子工业出版社 2013-09-01 P
C++ Templates 第2版 中文版 9787115601513 [美]范德沃德,约祖蒂斯 人民邮电出版社 2024-01-01
C++ Templates 第2版 英文版 9787121155352 [美]范德沃德,约祖蒂斯 人民邮电出版社 2018-05-01 P
C++ Templates 中文版 9787115479938 [美]范德沃德,约祖蒂斯 人民邮电出版社 2013-04-01 P
深入应用C++11:代码优化与工程级应用 9787111500698 祁宇 机械工业出版社 2015-05-01 P,JV
深入理解C++11:C++ 11新特性解析与应用 9787111426608 Michael Wong 机械工业出版社 2013-06-01 P,JV
现代C++语言核心特性解析 9787115564177 谢丙堃 人民邮电出版社 2021-10-01 P,JV
学习C++20(中文版) 9787302625438 [美]Paul J. Deitel,[美]Harvey M. Deitel 清华大学出版社 2023-05-01
标准C++输入输出流与本地化 9787115090522 万东旭,陈冀康 人民邮电出版社 2001-04-01 P
C++ Core Guidelines解析 9787302635772 [德]赖纳·格林 清华大学出版社 2023-07-01
阅读全文 »

参考图书

书名 ISBN 作者 出版社 出版日期 备注
C和指针 9787115522689 [美]肯尼斯·里科 人民邮电出版社 2020-09-01 P
C陷阱与缺陷 9787115521279 [美]安德鲁·凯尼格 人民邮电出版社 2020-08-01 P
C专家编程 9787115521323 [美]彼得·范德林登 人民邮电出版社 2020-09-01 P
C语言接口与实现 创建可重用软件的技术 9787115402523 [美]戴维 R.汉森 人民邮电出版社 2022-07-01

VSCode是微软出品的编辑器,简单清凉、扩展丰富。vscode依赖扩展完成各种丰富的功能实现,像胶水一样将扩展整合起来。同时支持跨平台,可以在Windows、Linux以及Mac上使用。本文记录相关的使用方法。

阅读全文 »

背景

使用天翼云盘的同步盘,我将同步目录设置为H:\Cloud\TySync,但使用同步盘较为频繁,每次按目录查找文件都比较繁琐。所以就想将这个同步目录映射为一个虚拟盘符,在资源管理器首页双击盘符即可进入同步盘。
于是网上找到了“vSubst”这个小工具,可以简单的将文件夹映射为虚拟盘符。


下载地址:https://www.onlinedown.net/soft/1915.htm

阅读全文 »

如SecureCRT一般,WindTerm是一款多协议、多功能、跨平台的终端仿真协议程序,用于Windows/Mac/Linux等环境登录UNIX/Linux服务器主机。与其他终端工具相比,最大特点就是开源、无论商业或者非商业应用均免费,特别适合一般小型公司使用
如WinTerm官方所言“WindTerm is a partial open source project, and the source will be gradually opened.”,目前它是部分开源,其他代码逐步计划开源。

WindTerm的主要功能:

  • 支持 SSH、Telnet、Tcp、Shell、Serial
  • 支持 SSH v2、Telnet、Raw Tcp、串行、Shell 协议。
  • 会话认证时支持 SSH 自动执行。
  • 支持 SSH ControlMaster。
  • 支持 SSH ProxyCommand 或 ProxyJump。
  • 支持 SSH 代理转发。
  • 支持使用密码、公钥、键盘交互、gssapi-with-mic 的 SSH 自动登录。
  • 支持 X11 转发。
  • 支持直接/本地端口转发、反向/远程端口转发和动态端口转发。
  • 支持 XModem、YModem 和 ZModem。
  • 集成 sftp、scp 客户端,支持下载、上传、删除、重命名、新建文件/目录等。
  • 集成本地文件管理器,支持移动到、复制到、复制自、删除、重命名、新建文件/目录等。
  • 支持 Windows Cmd、PowerShell 和 Cmd、PowerShell 作为管理员。
  • 支持 Linux bash、zsh、powershell core 等。
  • 支持 MacOS bash、zsh、powershell core 等。

更多:https://github.com/kingToolbox/WindTerm/blob/master/README.md

官网:https://github.com/kingToolbox/WindTerm

下载:https://github.com/kingToolbox/WindTerm/releases

阅读全文 »

本次对Hexo的修改,主要完成如下两个功能:

  • 第一,Hexo的分类默认使用名称按照字典排序,我希望是自己可以方便指定分类序号,从而按序号排序显示;
  • 第二,Hexo的分类名称需要直接写在Post文档categories的字段,后续如果需要修改某个分类名称,需要修改多个文档,我希望是给每个分类起个别名,Post文档中使用该别名,在特定的文档中定义别名和真实名称的映射关系,然后Hexo生成静态页面时,Hexo自动对别名进行替换。
阅读全文 »

本博客是由Hexo来编译发布的,这里记录下Hexo首次安装和重新下载博客代码之后重置环境的方法。

首次安装Hexo

第一步,安装Node.js。我们可以使用腾讯电脑管家,搜索nodejs来安装。或者到Node.js的官方网站下载来安装。

访问官方网站:https://nodejs.org
直接下载链接:https://nodejs.org/dist/v20.17.0/node-v20.17.0-x64.msi

下载完毕之后,双击安装即可,这里不再赘述。

第二步,设置Node.js使用国内源。命令如下:

1
2
3
4
5
## 设置为腾讯源
npm config set registry http://mirrors.cloud.tencent.com/npm/

## 查看数据源
npm config get registry

第三步,使用如下命令安装Hexo

1
npm install -g hexo

安装过程如下图所示:

第四步,Hexo完毕之后,我们建立一个新的博客系统。

首先,我们创建一个空的目录,来存放工程文件。比如 d:/mancode/DemoBlog

然后,使用如下命令建立工程文件,并且启动脚手架演示页面。(如果提示错误,使用管理员来启动cmd)

1
2
3
hexo init .
hexo g
hexo s

使用浏览器,访问 http://localhost:4000 ,如果出现如下页面,则说明创建脚手架工程成功。

重置开发环境

从上步创建脚手架工程来看,DemoBlog目录下有个node_modules目录,这里存储了Hexo运行所需的NodeJs模块,很多也很大,所以一般我们不会将node_modules这个目录提交到SVN或者Git。

那这里有个问题,我们在其他机器上下载项目之后,如何重建node_modules目录呢?
我们使用如下命令来重新下载依赖并存在node_modules目录,所下载的模块是依据package.json文件来确定的:

1
npm install

说明一个问题

在我重新下载依赖时,出现了这么一个问题:

1
Error: Cannot find module 'finalhandler'

该问题的处理方法:删除package-lock.json和node_modules目录里的finalhandler,然后再次执行npm install。

参考资料