C++ and mysql
文章平均质量分 82
C++ and mysql
喜欢打篮球的普通人
这个作者很懒,什么都没留下…
展开
-
使用std::unique_ptr Pimpl造成的incomplete type的报错分析和解决
自定义删除器,将delete pImpl的操作,放到widget.cpp源文件中。// 预先声明class Impl;然后在源文件widget.cpp中delete p;这种方法改起来也不复杂,但是弊端也很明显,std::make_unique没法使用了,只能自己手动new,直接看源码吧这里返回的是默认删除器类型的unique_ptr,即std::unique_ptr。// 错误!原创 2024-02-25 17:11:00 · 798 阅读 · 0 评论 -
【C++20】编译期检测所有未定义行为undefined behavior和内存泄漏(不借助编译选项以及任何外部工具)
【C++20】编译期检测所有未定义行为和内存泄漏,不借助任何外部工具。原创 2024-01-06 09:57:54 · 696 阅读 · 0 评论 -
使用dlopenC++动态库的函数符号的常规做法
在 C 中,符号名称与函数名称相同:strcpy 的符号将是 strcpy,因为在 C 中没有两个非静态函数可以具有相同的名称。因为 C++ 允许重载(具有相同名称但不同参数的不同函数)并且具有许多 C 所没有的功能(如类、成员函数、异常规范),所以不可能简单地使用函数名称作为符号名称。C++ 有一个特殊的关键字来声明具有 C 绑定的函数:extern “C”。声明为 extern “C” 的函数使用函数名称作为符号名称,就像 C 函数一样。因此,只有非成员函数可以声明为 extern “C”,并且不能重载原创 2023-11-18 16:31:30 · 322 阅读 · 0 评论 -
c++ inline namespace
C++11引入了inline namespace的语法,这个语法可以让程序员在不破坏现有代码的情况下添加新的命名空间。inline namespace的作用是将内层的命名空间成为外层的一个别名。也就是说,当程序员使用外层命名空间的时候,内层命名空间的内容也可以被访问到,不需要加上内层命名空间的限定符。这个特性可以帮助程序员更好地组织代码。举个例子,假设我们有一个命名空间foo,里面包含一个内层命名空间bar。// bar 中的内容// foo 中的内容。原创 2023-09-25 10:47:16 · 183 阅读 · 0 评论 -
C++正则表达式regex使用总结
正则表达式(regular expression)的C++库regex是一种强大的描述字符序列的工具 , C++11中也将正则表达式纳入了新标准的一部分。regex库中常用组件介绍在头文件中包含了多个我们使用正则表达式时需要用到的组件,即 #includeregex库组件详细介绍如下regex表示有一个正则表达式类,比如:regex pattern(“(.{3})(.{2})_(\d{4})!”)全文匹配,要求整个字符串符合正则表达式的匹配规则。原创 2023-09-23 17:31:19 · 1090 阅读 · 0 评论 -
C++中的类型擦除技术
在 main() 函数中,我们创建了两个不同类型的 Derived 对象 d1 和 d2,然后创建了一个 Functor 对象 f。通过调用 f(d1) 和 f(d2),我们将不同类型的对象传递给函数对象 f,它将根据对象的类型调用适当的 foo() 实现。process() 函数接受一个 std::function 类型的参数,它表示一个无返回值、不带参数的可调用对象。C++语境下的类型擦除,技术上来说,是编写一个类,它提供模板的构造函数和非虚函数接口提供功能;所以,这段代码可以过编译。原创 2023-08-17 17:23:11 · 722 阅读 · 1 评论 -
C++变长模板参数、参数打包、tuple、index_sequence、逗号运算符、与折叠表达式
【代码】C++变长模板参数、参数打包、tuple、index_sequence、逗号运算符、与折叠表达式。原创 2023-08-03 22:46:32 · 415 阅读 · 0 评论 -
C++之type_traits与SFINAE用法
【代码】C++之type_traits与SFINAE用法。原创 2023-06-25 23:26:01 · 250 阅读 · 0 评论 -
使用auto对C++局部变量进行初始化
【代码】使用auto对C++局部变量进行初始化。原创 2023-06-08 07:41:02 · 226 阅读 · 0 评论 -
现代C++教程2023
模板参数:是一个模板类型。原创 2023-05-04 07:25:12 · 360 阅读 · 0 评论 -
C++类模板和函数模板声明和定义几种写法
};声明和实现分离,include了头文件之后不会把实现的代码也加入到该编译单元。然后需要将所有用到的类型都显式的实例化。. . . };原创 2023-02-01 23:32:41 · 290 阅读 · 0 评论 -
C++模板(第二版)笔记之第十二章:萃取的实现
解决办法3:对于那些不是总是生成整型值的值萃取, 使用 inline 成员函数。同样的, 如果成员函数返回的是字面值类型, 可以将该函数声明为 constexpr 的。问题:一个用户定义的任意精度的 BigInt 类型, 可能就不是字面值类型,原创 2023-01-11 23:55:39 · 562 阅读 · 0 评论 -
C++模板(第二版)笔记之第十八章:模板的多态性
动态多态:继承和虚函数实现;静态多态:模板也允许我们用单个统一符号将不同的特定行为关联起来, 不过该关联主要发生在编译期间;二、静态多态模板也可以被用来实现多态。 不同的是, 它们不依赖于对基类中公共行为的分解。 取而代之的是, 这一“共性( commonality) ” 隐式地要求不同的“形状( shapes) ” 必须支持使用了相同语法的操作。动态多态的eg改造成静态多态三、静态多态VS动态多态1.术语Static 和 dynamic 多态提供了对不同 C++编程术语的支持:动态多态:原创 2023-01-10 23:34:58 · 506 阅读 · 0 评论 -
C++模板(第二版)笔记之第十一章:泛型库
可以将函数, 函数指针, 函数对象, 仿函数和 lambdas 作为可调用对象(callables) 传递给模板。如果需要为一个 class 重载 operator(), 那么就将其声明为 const 的(除非该调用会修改它的状态)。通过使用 std::invoke(), 可以实现能够处理所有类型的、 可调用对象(包含成员函数)的代码。使用 decltype(auto)来完美转发返回值。类型萃取是可以检查类型的属性和功能的类型函数。原创 2023-01-03 23:37:59 · 466 阅读 · 0 评论 -
C++模板(第二版)笔记之第十章:模板基本术语
;唯一定义法则 one-definition rule,ODR) 常规(比如非模板) 非 inline 函数和成员函数, 以及非 inline 的全局变量和静态数据成员, 在整个程序中只能被定义一次。 Class 类型(包含 struct 和 union) , 模板(包含部分特例化, 但不能是全特例化) , 以及 inline 函数和变量, 在一个编译单元中只能被定义一次, 而且不同编译单元间的定义应该相同。编译单元是通过预处理源文件产生的一个文件;原创 2023-01-03 22:49:51 · 278 阅读 · 0 评论 -
C++模板(第二版)笔记之第九章:在实践中使用模板
这个文件的编译会花费一些时间, 但是如果内存足够的话, 预编译方案的编译速度几乎要比在不使用预编译方案时编译其它任何一个标准库头文件都要快。模板函数:和 inline 函数类似, 函数模板也可以被定义在多个编译单元中。为了实例化一个模板,编译器既需要知道需要实例化哪个函数, 也需要知道应该用哪些模板参数来进行实例化。当被定义在头文件中, 且不在类或者结构体中时, 函数模板的全特例化版本需要使用inline。不幸的是, 在上面这个例子中, 这两组信息都是被放在别的文件里单独进行编译的。原创 2023-01-02 23:07:29 · 503 阅读 · 0 评论 -
C++模板(第二版)笔记之第八章:编译期编程
IsPrime模板将结果存储在其成员 value 中。为了计算出模板参数是不是质数, 它实例化了DoIsPrime模板, 这个模板会被递归展开, 以计算 p 除以 p/2 和 2 之间的数之后是否会有余数。C++14则没有,但是要求各个计算步骤都能在编译期进行,此外堆内存分配和异常抛出都不被支持。C++模板的原始递归模板可以用来“计算一个程序的结果”由于 9%3 == 0, 因此它将返回 false;的定义通常都只能包含一个 return 语句。原创 2023-01-01 20:03:49 · 568 阅读 · 0 评论 -
C++并发编程总结
【代码】C++并发编程总结。原创 2022-12-25 21:42:35 · 157 阅读 · 0 评论 -
Linux下JsonCpp的使用教程
Value 类:将 json 支持的数据类型进行了包装,最终得到一个 Value 类型。Reader类:反序列化,将 json 字符串 解析成 Value 类型。FastWriter类:将 Value 对象中的数据序列化为字符串。将 Value 对象数据序列化为 string。将 Value 对象转换为实际类型。对 json 数组的操作。对 json 对象的操作。FastWriter 类。开发环境ubuntu。原创 2022-12-24 18:22:26 · 1736 阅读 · 0 评论 -
C++11后的初级模板
2)如果expression是一个函数调用,则var的类型与函数的返回值类型相同(函数不能返回void,但可以返回void *)。3)非约束模板友元:模板类实例化时,如果实例化了n个类,也会实例化n个友元函数,每个实例化的类都拥有n个友元函数。具体化程度高的类优先于具体化程度低的类,具体化的类优先于没有具体化的类。1)非模板友元:友元函数不是模板函数,而是利用模板类参数生成的函数。2)约束模板友元:模板类实例化时,每个实例化的类对应一个友元函数。2)函数模板,参数和返回值是某种的模板类。原创 2022-12-24 16:57:10 · 519 阅读 · 0 评论 -
C++11后的智能指针
unique_ptr独享它指向的对象,也就是说,同时只有一个unique_ptr指向同一个对象,当这个unique_ptr被销毁时,指向的对象也随即被销毁。(可用于把unique_ptr传递给子函数,子函数将负责释放对象)8)unique_ptr不是绝对安全,如果程序中调用exit()退出,全局的unique_ptr可以自动释放,但局部的unique_ptr无法释放。7)unique_ptr也可象普通指针那样,当指向一个类继承体系的基类对象时,也具有多态性质,如同使用裸指针管理基类对象和派生类对象那样。原创 2022-12-19 11:31:23 · 323 阅读 · 0 评论 -
C++11后的STL算法
STL定义了多个基本的函数符,用于支持STL的算法函数。包含头文件:#include < functional >原创 2022-12-17 22:34:43 · 499 阅读 · 0 评论 -
C++11后的常用容器和迭代器
pair是类模板,一般用于表示key/value数据,其实现是结构体。给已存在的容器赋值,将覆盖容器中原有的内容。原创 2022-12-15 22:22:12 · 983 阅读 · 0 评论 -
C++模板(第二版)笔记之第七章:按值传递还是按引用传递?
C++就提供了按值传递(call-by-value) 和按引用传递(call-by-reference) 两种参。参数通过移动语义引用了被传递的对象, 并且参数值可以被更改或者被“窃取”。参数引用了被传递的对象, 并且参数不能被更改。参数引用了被传递的对象, 但是参数可以被更改。X const &(const 左值引用)ref:《C++Template》第二版。X &(非 const 左值引用)X &&(右值引用)原创 2022-12-14 15:56:35 · 412 阅读 · 0 评论 -
C++模板(第二版)笔记之第六章:移动语义和 enable_if
只能被绑定到一个可移动对象上( 一个rvalue, 比如临时对象, 一个 xvalue, 比如通过 std::move()传递的参数,而 std::forward会跟据被传递参数的具体情况决定是否“转发” 其潜在的移动语义。在函数内部这个参数也可以是可变、 不可变或者指向一个可以被窃取内部数据的值。缺点:这个模板只对前两种情况有效, 对第三种用于可移动对象的情况无效。模板参数 T 的 T&&声明了一个转发引用( 亦称万能引用)。可移动对象(可以从中窃取资源的对象) 被转发之后依然是可移动的。原创 2022-12-13 20:35:47 · 582 阅读 · 0 评论 -
C++Template学习
C++原创 2022-12-13 17:21:59 · 163 阅读 · 0 评论 -
C++模板(第二版)笔记之第四章:变参模板
args 是一个可变模板参数, 它包含类型是 char const*的“hello” 和类型是 std::string 的“world”firstArg 的值是“hello” , 其类型 T 是 char const *。firstArg 的值是“world” , 其类型 T 是 std::string。args 是一个可变模板参数, 它包含的参数类型是 std::string。firstArg 的值是 7.5, 其类型 T 是 double。args 是一个空的可变模板参数, 它没有任何值。原创 2022-11-30 23:14:50 · 855 阅读 · 0 评论 -
鲜为人知的C++黑科技【__PRETTY_FUNCTION__】非侵入式的编译期反射
【代码】鲜为人知的C++黑科技【__PRETTY_FUNCTION__】非侵入式的编译期反射。原创 2022-10-27 23:39:46 · 936 阅读 · 0 评论 -
聊一聊C++设计模式、函数式编程等
自定义match模板函数可以将多个lamda打包成一个。用static可以检测实例化了几次。运行期判断转变成编译器判断。可以在编译器进行判断。原创 2022-09-05 23:27:26 · 590 阅读 · 3 评论 -
Zeno节点系统中的C++最佳实践
注意这里解构函数(~IObject)也需要是虚函数,否则以 IObject * 存储的指针在 delete 时只会释放 IObject 里的成员,而不会释放 CatObject 里的成员 string m_catFood。这样只需要写一遍 eatTwice,就可以对猫和狗都适用,实现代码的复用(dont-repeat-yourself),也让函数的作者不必去关注点从猫和狗的其他具体细节,只需把握住他们统一具有的“吃”这个接口。所以这里的解构函数也是多态的,他根据类型的不同调用不同派生类的解构函数。原创 2022-08-23 23:27:28 · 602 阅读 · 0 评论 -
C++设计模式之:面向对象设计原则
C++设计模式原创 2022-08-23 22:45:46 · 383 阅读 · 0 评论 -
C++11开始的多线程编程
时间点类型:chrono::steady_clock::time_point 等(一种是CPU计数器,一种是OS提供的,通常精度高选择steady_clock )时间段类型:chrono::milliseconds,chrono::seconds,chrono::minutes 等。利用 C++ 强类型的特点,明确区分时间点与时间段,明确区分不同的时间单位。方便的运算符重载:时间点+时间段=时间点,时间点-时间点=时间段。时间点例子:2022年1月8日 13点07分10秒。时间段例子:1分30秒。原创 2022-08-17 23:20:42 · 1225 阅读 · 0 评论 -
全面理解STL标准库 vector容器
这也体现了实际容量(capacity)和数组大小(size)分离的好处,如果死板地让分配的内存容量始终等于当前数组大小(很多同学都号称自己实现过 vector,都是这种写法),那么如果要用 push_back 推入 n 个元素,就需要重新分配内存 n 次,移动元素 n(n+1)/2 次。调用第二个重载 resize(n, val) 的时候,如果数组已有超过 n 个元素,假设是 m 个,则第二参数 val 会被无视,删除多出来的 m - n 个元素,前 n 个元素会保持不变。原创 2022-08-15 23:29:38 · 512 阅读 · 0 评论 -
【C++标准库】你有所不知的set容器
set 作为模板类,其实有两个模板参数:set第一个 T 是容器内元素的类型,例如 int 或 string 等。第二个 CompT 定义了你想要的比较函子,set 内部会调用这个函数来决定怎么排序。如果 CompT 不指定,默认会直接用运算符 < 来比较。这里我们定义个 MyComp 作为比较函子,和默认的一样用 < 来比较,所以没有变化。} };return 0;}这里我们把比较函子 MyComp 定义成只比较字符串第一个字符 a[0] < b[0]。原创 2022-08-09 23:33:59 · 1581 阅读 · 0 评论 -
C++中static_cast和dynamic_cast强制类型转换
https//blog.csdn.net/qq_26849233/article/details/62218385。原创 2022-08-02 09:04:32 · 1312 阅读 · 0 评论 -
【C++标准库】std::string用法指南&源码剖析
众所周知,我们常用 Ctrl+C 来发送中断信号(SIGINT)强制终止程序,这时常常会看到一个 ^C 的字样,就是这样出现的。这里我们的 cat 程序收到 ^C 以后,就直接终止退出了。以及按 Ctrl+I 的效果其实和 Tab 键一样,按 Ctrl+J 的效果和 Enter 键一样,按 Ctrl+H 的效果和退格键一样。eg:“char 即整数”思想,这个整数对应该字符的ASCII,下面的两者写法是等价的。试试按 Ctrl+R,Ctrl+E,Ctrl+C 等一系列组合键,看到出现了什么?...原创 2022-07-20 23:30:05 · 3703 阅读 · 1 评论 -
模板元编程与函数式
使用 template其中 T 可以变成任意类型。调用时 twice 即可将 T 替换为 int。注意有的教材上写做:template < typename T > 是完全等价的,只是个人喜好不同。}}}}如果我们试着像传统函数那样分离模板函数的声明与实现:就会出现 undefined reference 错误:一般来说,我会建议模板不要分离声明和定义,直接写在头文件里即可。原创 2022-07-10 23:28:00 · 718 阅读 · 0 评论 -
初探C++ CRTP(奇异的递归模板模式)
简单来说,CRTP有两大特性:问题来了,为什么要这样做呢?这里将基类转换成派生类用的是static_cast静态绑定,而普通基类转派生类用的是dynamic_cast动态绑定。动态绑定的目的是为了确保你所转化的派生类是正确的,而对于CRTP来说,基类是继承于模板类的参数,也就是派生类本身。 这也正是CRTP这种设计的目的。2.CRTP的优点多态是个很好的特性,但是动态绑定比较慢,因为要查虚函数表。eg:2.轻松地实现各个子类实例创建和析构独立的计数eg:3.多态链(Polymorphic原创 2022-07-04 14:09:33 · 2674 阅读 · 0 评论 -
C++类模板中如何调用其基类模板中的函数(模板中使用虚函数)
测试:原因:见2.C++模板的名字查找如何解决呢?在编译模板的时候,编译器会分两个阶段去解析遇到的名称,测试:eg:类模板而言因为f()不依赖与模板参数T,所以它在第一阶段就会被解析,而它的基类X在第二阶段才会被解析,所以解析f()的时候只能看到全局作用域里的typedef double E测试:eg:测试:(1)第一种方式调用了全局的g(),(2)第二种方式调用了基类的g(),(3)原因在于当编译器遇到第一种方式的g()时,发现它没有表现出要依赖于模板参数,所以认为它不依原创 2022-07-02 11:02:12 · 3419 阅读 · 0 评论 -
RAII内存管理
这些业务往往都是在和资源打交道,从而基本都是刚刚说的要删除拷贝函数的那一类,解决这种需求,几乎总是在用 shared_ptr 的模式,于是 Java 和 Python 干脆简化:一切非基础类型的对象都是浅拷贝,引用计数由垃圾回收机制自动管理。与 Java,Python 等垃圾回收语言不同,C++ 的解构函数是显式的,离开作用域自动销毁,毫不含糊(有好处也有坏处,对高性能计算而言利大于弊)如果你的类所有成员,都是安全的类型,那么五大函数都无需声明(或声明为 = default),你的类自动就是安全的。原创 2022-06-29 23:40:41 · 521 阅读 · 0 评论