0%

std::function<> 模板到底是什么? 可以简单理解为对应 C 语言中的函数指针。入参或绑定的参数如果是原始指针或引用时,需要特别注意其生存周期。

关于函数类模板,学习《Effective.Modern.C++》P39

And maybe now you’re thinking “What’s a std::function object?” So let’s clear that up

boost::empty_value 的意义?

待补充

获得 std::function 对象

Lambda expressions

Constructs a closure: an unnamed function object capable of capturing variables in scope. 摘自 lambda

Function objects

A function object is any object for which the function call operator is defined. 摘自 functional

std::function,推荐查看其 Example

Class template std::function is a general-purpose polymorphic function wrapper. Instances of std::function can store, copy, and invoke any CopyConstructible Callable target – functions, lambda expressions, bind expressions, or other function objects, as well as pointers to member functions and pointers to data members. 摘自 function

需要强调的是 C++ 标准未对 std::bind 表达式的返回类型做出定义,其返回值并不对应我们熟悉的任何类型,但可以直接赋值给 std::function<>

1
2
3
4
5
6
7
8
9
10
std::function<int(int)> func = std::tolower;
std::function<int(int)> lamb = [](int a) { return a; };
std::string str("niel");
std::function<size_t(void)> bind = std::bind(&std::string::size, &str);
std::function<int(int, int)> object = std::plus<int>();
std::function<size_t(const std::string&)> p2mf = &std::string::size;

//std::function<size_t(void)> bind = std::bind(&std::string::size, std::ref(str));
//// 拷贝传参,请务必明白在做什么。also works, but str is copied
//std::function<size_t(void)> bind = std::bind(&std::string::size, str);

模板参数

1
2
3
// ERR,末尾多余的 const 造成报错内容在千里之外
using SENDFUNC = std::function<void(CBD , void const * const , size_t ) const>;
using SENDFUNC = std::function<void(CBD , void const * const , size_t ) /*const*/>;

递归调用

为什么 function<> 对象递归调用自身不能使用 auto?

vc2015 IntelliSence 提示

使用 auto 类型说明符声明的变量不能出现在其自身的初始值设定项中

阅读全文 »

类接口:保持接口的最小化

p207

当我们试图最小化类接口时(在保证完整性的前提下),不得不忽略大量有用的操作。如果一个函数可以简单、优美、高效地实现为一个独立函数时(即实现为非成员函数),就应该将它的实现放在类外。采用这种方式,函数中的错误就不会直接破坏类对象中的数据。p213

如何创建自己的 vector

预留空间 和 std::allocator

注意,我们并不对预留空间中的元素进行初始化。 p329

我们需要处理非常尴尬的情况:数据结构同时包含已初始化数据和未初始化数据。p341

因为内置的数值类型都是小对象,所以可以一律初始化,无需在意开销。但对于自定义类型,初始化要有的放矢。

阅读全文 »

学习 c++20 首先要有支持相关特性的编译器

msvc2019 如果和工作用的 msvc2015 安装在同一台机器上,在使用 vcpkg 时会产生冲突

clang 在 windows 下的使用并不平滑,如果初衷是 c++20,就不要舍本逐末。在熟悉 c++20 后回头折腾 clang

虚拟机上安装 msvc2019,Hyper-V 是好的选择吗?如果要用 VMware 还是躲开 Hyper-V

阅读全文 »

查看 std::exception 的定义,除了析构函数,其他包括默认构造和拷贝构造在内的函数都声明为 noexcept

因为不允许复制 std::exception 抛出异常,故当派生类(例如 std::runtime_error )必须管理用户定义的诊断信息时,常将它实现为写时复制的字符串。

查看 std::logic_error 的定义std::runtime_error 的定义:

因为不容许复制 std::logic_error 抛出异常,通常将此消息在内部存储为分离分配的引用计数字符串。这也是构造函数不接收 std::string&& 参数的理由:无论如何它必须复制内容。

阅读全文 »

内核对象的概念,是什么?

设备内核对象?

事件内核对象?

阅读全文 »

安装 VMware workstation 15 player 时,提示:

VMware workstation 15 player 和 Hyper-V 在此版本的 windows 上不兼容。

请从系统中移除 hyper-v 角色或将 windows 更新到 windows 10 版本 20H1。

我选择了在“启用或关闭 windows 功能”中关闭 Hyper-V,需要重启。后续启动虚拟机的时候还是报错:

您的主机不满足在启用 Hyper-V 或 Device/Credential Guard 的情况下运行 VMware Workstation 的最低要求。

参考帖子 :在禁用 Device/Credential Guard 后,可以运行 VM 的方法 , 重启生效。

阅读全文 »

最近两会,科学上网又宕机了。打算专心学习一下 v2ray 的插件和配置,此笔记用于备忘操作过程中的细节。也涉及 linux 系统的基础操作。

为了安全(和方便),提出以下要求或目标:禁用账号密码登录,全部改用密钥。 建立 vps 后的第一步

关于 v2ray xray v2fly,可以看看 V2Ray、Trojan、XRay

阅读全文 »

建立 vps 后(主要用于科学上网)首先要保证后续的使用安全。否则再多的功能都是空中楼阁。

SSH 登录

非对称密钥算法的作用分为两种场景:

  • 加密数据:公钥加密,私钥解密。数据由前者发往后者,数据是安全的。
  • 认证:私钥加密,公钥解密。后者验证前者的身份,传输数据的安全性是没有保证的。

那么远程登录呢?

SSH 本身提供两种级别的验证方法:基于口令的安全验证;基于密钥的安全验证。引用来源

阅读全文 »

在工作中,遇到的几个关于构造函数的问题,以及语言边缘的坑(如何避开)。

显式类型转换函数和构造函数优先级?

1
2
3
Minimal(src);	// 不是类型转换语法吧?
// vs
(Minimal)src;

会先按照构造函数解析,还是

构造函数能不能相互调用?

http://www.cppblog.com/wolf/articles/63490.html

http://www.cnblogs.com/chio/archive/2007/10/20/931043.html

传统的 func(var) 调用方式肯定不行,因为这意味着在某构造函数中又创建了个临时对象。

阅读全文 »

检查内存泄漏

Linux 下使用 Valgrind;Windows 下使用 Visual Leak Detector。前者没接触过,后者的确不错。

虽然在 Windows 下可以使用 CRT:Find memory leaks with the CRT library,但因为其也会报全局变量以及 static 变量(报告早于这两者的析构),当项目体量较大,全局变量或 static 变量较多时,没有有效的区分,查找真实的内存泄漏就会比较棘手。

  1. Enable memory leak detection,如何启用

    只在启用 _DEBUG 时有效;若程序存在多个退出点,可以使用 _CrtSetDbgFlag 函数;报告默认在“输出”窗口打印,但可以自定义。

  2. Interpret the memory-leak report,报告怎么看

    重点强调了检测只针对 malloc 函数,无法检测 new 操作符。但其提供了使用 _malloc_dbg 实现的 operator new 重载版本:

  3. Set breakpoints on a memory allocation number,如何打断点

  4. Compare memory states,对比不同时刻的快照

  5. False positives,误报现象

阅读全文 »