- 博客(151)
- 资源 (4)
- 收藏
- 关注
原创 sfinae时,std::void_t用来判断是否存在某个变量或者函数
比如判断是否为int的偏特化,应该怎么写。那么,下面就是一个判断T里是否。
2025-07-21 16:20:59
107
原创 std::bind常用来实现闭包
std::bind可以充当函数适配器,即它接受一个原函数作为输入并返回一个新的函数对象作为输出,返回的函数对象包含一个或多个与原函数绑定的参数。std::bind可以预先指定函数的所有参数,也可以将函数的部分参数预先指定好,剩下的参数等真正调用的时候再指定。闭包( Closure)这个概念起源于函数式编程,是指外部变量与函数之间的绑定,可以这样理解,捕获了外部变量的lambda表达式是一种闭包。std::bind是C++11标准引入的函数模板,用于取代bind1st和bind2nd等旧式语法。
2025-06-24 14:42:31
170
原创 bind对非静态成员函数的绑定
/ 智能指针亦能用于调用被引用对象的成员。/ 也可以这样绑定指向数据成员指针。// 绑定指向静态成员函数指针。// 绑定指向成员函数指针。// 绑定指向数据成员指针。
2025-06-23 11:21:06
246
原创 std::remove要注意的:不是把不符合要求的元素移动到容器后面,而是:把符合要求的移动到前面。所以不应该叫remove,应该叫move_correct_element_to_front
不是把不符合要求的元素移动到容器后面,而是:把符合要求的移动到前面。所以不应该叫remove,应该叫move_correct_element_to_front
2025-06-21 18:47:16
121
原创 【无用知识研究】模板+std::bind,如何用bind绑定变长的参数来适配固定个数参数的接口
要注意的是,std::bind(checker, std::placeholders::_1, type)返回的是一个对象,其保留了checker这种执行体(的拷贝),也保留了变量type。在GetSpecificResult这里,_TypeChecker被自动推导出来,类型是std::bind的返回类型。
2025-06-21 12:59:15
112
原创 【无用知识研究】如何把non-capturing lambda 手动cast到函数指针
若需处理带捕获的lambda,可参考通过静态变量存储lambda对象的方法2,但这已超出non-capturing lambda的范围。对于无捕获的lambda表达式,可以直接使用。或隐式转换为匹配的函数指针类型49。
2025-06-12 15:46:18
278
原创 传进函数(指针)时,用模板函数,还是std::function
个人感觉应该用模板好一点?起码没有限制传入函数的形式。如果用std::function的时候,需要函数的签名。
2025-04-16 15:02:19
122
原创 C++的模板duck typing和继承的区别
但这两种还是差别较大,duck typing例子里面的函数somefunc,不光可以接受duck,任何具有sing接口的对象,都可以调用。但在调用时必须知道具体类型。在模板的世界里,具体类型是很重要的。在模板的方式里,接口更像是duck们所具有的某种属性,你只要有,那么就可以。简而言之,如果你在调用的时候就知道具体类型,那么可以用模板。如果你不知道具体类型,那么就可以用继承。
2025-02-17 15:57:33
194
原创 无用知识研究?对泛型库(如boost)扩展的思路,带一个对stl里std::common_type进行特化的例子
来自一位大佬的文章,觉得挺受启发。
2025-02-04 13:39:47
172
原创 无用知识研究:std::initializer_list的秘密
这个std::initializer_list是怎么个事呢,它就是一个wrapper,一个viewer。所以std::initializer_list对象的拷贝,也是属于“浅拷贝”,保存的都是指针,不影响它们指向的数据。先说结论,用std::initializer_list初始化vector,内部逻辑是先生成了一个临时数组,进行了拷贝构造,然后用这个数组的起终指针初始化initializer_list。所以说,用initializer_list初始化,还是有优化空间的。
2025-02-02 22:16:47
652
原创 无用知识研究:对std::common_type以及问号表达式类型的理解
也就是说true : 2 : 1.0作为一个整体,它有一个类型,系统会取其“共同”的类型。用decltype()来取,比如decltype(true : 2 : 1.0)。但它是在编译期来确定的,而不是运行期来确定,所以它不管condition的。所以第一条里面,true : 2 : 1.0的值为什么是2.0呢,因为decltype对其分析的结果就是double。比如一个问号表达式true : 2 : 1.0。它有一个值,这个值是根据condition判断出来的(这个例子里是true)。
2025-01-29 23:19:17
364
原创 过年之无用知识研究:std::is_assignable中的declval<_Dest>() = declval<_Src>()
【代码】无用的知识又增加了:assignable means?
2025-01-28 00:08:26
644
原创 过年之无用知识研究:std::is_assignable到底怎么个事?参考operator=
【代码】std::is_assignable到底怎么个事?
2025-01-27 21:28:44
232
原创 过年之无用知识研究:std::pair源码中operator=为什么被delete了,而提供sfinae版本
【代码】std::pair源码:operator=被delete了,提供的是sfinae版本。
2025-01-27 17:46:53
282
原创 data driven
https://philippegroarke.com/posts/2022/data_driven_descriptor_based_generative_cpp/
2024-12-27 18:37:30
435
原创 C++模板:编译时模拟Duck Typing
return p?class foopublic:class barpublic:OK, nice!allclass foopublic:class barpublic:This:do noclass foopublic:class bazpublic:......public:m_o(o)private:public:
2024-12-25 18:05:02
845
原创 打个共鸣的响指吧:给模板成员函数添加“限制”的方法:考察shared_ptr的operator->模板成员函数
后面的是模板成员函数operator->的实例化参数,0是enable_if_t对CPoint的判断结果。shared_ptr的operator->是shared_ptr模板类里的模板成员函数。第一个CPoint就是实例化shared_ptr时的CPoint,并且operator->加上了“限制”:不能是数组(!>() 行 1493 C++
2024-12-20 14:35:31
169
原创 模板decltype在对第三方库api声明有改动时的应对(原理:sfinae)
【代码】模板decltype在对第三方库api声明有改动时的应对。
2024-12-12 18:35:07
259
原创 利用尾部返回中的std::common_type实现sfinae
这里展示的使用场景,是在已有数据结构的基础上,对不同类型的迭代器在编译时进行选择:不同的迭代器返回其值。
2024-12-12 16:53:01
259
原创 unique_ptr自定义删除器,_Compressed_pair利用偏特化减少存储的一些设计思路
LeeCarry这世界太繁杂了,我只想守护自己的纯粹25 人赞同了该文章无意间看到FOCUS:现代 C++:一文读懂智能指针595 赞同 · 12 评论文章昂,一个unique_ptr要用40字节???第一反应是作者是不是笔误多打了个0?然而细看一下不对啊,这里应该是用64位测的,一个raw pointer是8字节,那应该不是笔误,再认真细看一下就明白了。
2024-12-09 13:21:42
912
原创 C++/Cli里重载winform的WndProc和ProcessCmdKey
不过看WndProc和ProcessCmdKey在C#上的定义,看不出System::Windows::Forms::Keys keyData居然不需要%注意,ProcessCmdKey里的第二个参数,不能用%
2024-11-28 15:54:39
360
原创 std::unique_ptr源码中构造函数的偏特化。_Unique_ptr_enable_default_t
【代码】std::unique_ptr源码中构造函数的偏特化。
2024-11-24 21:48:56
255
原创 【转】std::unique_ptr 删除器的秘密
可以看到,使用函数指针作为删除器产生的 std::unique_ptr 对象大小为 16 字节,使用 std::function 则为 40 字节,而使用无状态 lambda 和默认删除器均为 8 字节,果真没有引入额外的内存开销。我们知道,即使是一个不带任何数据成员的空类,其对象也至少要占一个字节,用以相互区别。而作者却说使用无状态的函数对象作为删除器,不会增加 std::unique_ptr 的大小。实际上,这玩意就是个模板类,和 std::pair 的概念类似,但特殊之处在于它有两个特化版本。
2024-11-23 17:35:58
1192
原创 std::unique_ptr自定义删除器(使用decltype推导类型)
【代码】std::unique_ptr自定义删除器(使用decltype推导类型)
2024-11-23 14:20:08
342
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人