- 博客(743)
- 收藏
- 关注
原创 Nlohmann json:通过json array直接调用函数
json array里面可以保存不同类型的数据,那么我们可不可以直接把array解构出来,传递给一个函数呢?✓ 所有调用都不需要手动指定模板参数!=== 自动类型推导示例 ===
2026-02-01 21:55:45
1
原创 Claude Code:模式修改
1.默认模式:修改文件等操作前会征询用户的同意。三种模式通过shift + tab 进行切换。3.自动模式:自动操作,不需要每次进行授权。2.规模模式:只讨论,不真正的开始操作。
2026-01-31 10:30:00
25
原创 Claude Code:Ubuntu设置中转
"ANTHROPIC_API_KEY": "你的中转key","ANTHROPIC_BASE_URL": "你的中转url"export ANTHROPIC_BASE_URL="你的中转url"4.这样就配置好了claude的中转,后面启动就跟Win下是一样的了。export ANTHROPIC_API_KEY="你的中转key"在文件中的最后加入(注意上一行最后需要有逗号)
2026-01-31 09:46:18
36
原创 Claude Code:Win11设置中转
"ANTHROPIC_API_KEY": "你的中转key","ANTHROPIC_BASE_URL": "你的中转url"2.1按Win+R,弹出的窗口中输入:%USERPROFILE%ANTHROPIC_API_KEY,值就是上面json中的key。安装完成后,直接通过在cmd命令窗口中输入ccusage进行查看。ANTHROPIC_BASE_URL,就是上面json中url。3.3然后点击环境变量,在弹出的对话框中选择新建。在该目录中会发现文件.claude.json。
2026-01-30 13:00:57
353
原创 NodeJS:安装
然后点击Windows安装程序,就会下载安装程序。安装完成后,打开命令行窗口,输入node -v。安装完成后,再按回车即可退出。查看到版本,即可说明成功安装了NodeJS。按任意键就可以直接安装。然后点击获取Node.js。1.下载nodejs。(自动安装必要工具)
2026-01-29 10:35:47
269
原创 程序人生:AI时代,学习编程还有用吗?
4.他对C++(即使对于C++23)的理解已经很全面了,对C++模版编程的理解程度也已经非常好了,这一点我觉得国内大部分C++工程师应该也做不到(也许是我了解的有限,据我了解,目前国内能用到C++17的就算是用的比较新了,对C++23的普及应该还不高,而且大部分做业务的公司应该也比较少的使用模版编程)。其实之前我也认真的想过这个问题,也许就目前而言,初级工程师受AI的影响更大,因为已经很明确的是AI肯定超过了初级工程师的编程水平,甚至我觉得面对资深工程师,AI也还是很能打的。
2026-01-28 18:38:29
759
原创 C++(23):反射的实现4 直接通过名字调用函数
增加了callByNameWrap函数,用于处理自动类型转换,这里的关键点是函数的返回值是FuncCallResult。这个类中最为关键的就是operator T(),该运算符完成FuncCallResult到目标类型的隐式转换。已经很接近实现反射了,但是这里有一点需要改进,就是调用时还需要传递返回值类型,以下是改进后的实现。这个反射的实现基本完成了,也许还有不能覆盖的场景,但是基本上把反射实现的方式说了一下。可以看到可以直接通过名字来找到函数并完成调用,而且可以直接转换为返回值类型。
2026-01-27 16:00:52
813
原创 C++(23):反射的实现3 通过map调用函数
callByNameWithRetType:通过函数名字调用函数,获取返回值的同时获取返回值类型。由于引入了member_function_traits,所以makeCallable略作了修改。可以看到可以通过名字来调用普通函数,lambda,函数对象,成员函数,成员函数指针。callByNameAs:通过函数名字调用函数,然后把返回值转换为想要的类型。这里又对之前的定义进行了扩展,加入对类的成员函数的处理。callByName:通过函数名字调用函数。
2026-01-27 11:49:42
237
原创 C++(23):反射的实现2 将函数抽象成统一的对象
makeCallable:借助makeCallable_impl将一个函数生成一个AnyCallable对象。cast_result:用于获取通过AnyCallable完成函数调用时的返回值。可以看到通过AnyCallable 可以把各种函数进行封装,然后完成调用。validate_args:用于检查函数参数的匹配。1.首先还是function_traits。AnyCallable:用于抽象所有的函数。
2026-01-26 21:26:22
132
原创 C++(23):反射的实现1 提取函数签名
编译程序,没有报错,所以没有触发static_assert,说明上面的function_traits可以正常的提取函数签名了。1.将各种形式的函数,包括成员函数,function函数对象,lambda函数全都推导为function_traits类型。3.function_traits的args_tuple推导为通过函数参数构建的tuple<Args...>类型。2.function_traits的return_type推导为函数的返回值类型。4.function_traits的arity表示参数的个数。
2026-01-26 18:12:16
36
原创 Boost:在Win11上安装1.90.0
可以下载直接安装,但是我没有安装Vistual Studio2022,而是使用的MinGW-W64 GCC编译器。其中prefix=C:\boost_1_90_0_mingw为安装路径(不需要预先建立,b2会自己建立)执行完成后会在D:\boost_1_90_0目录下生成b2.exe文件。编译完成后会自动安装到C:\boost_1_90_0_mingw。2.将下载的代码解压至D:\boost_1_90_0。3.进入D:\boost_1_90_0目录然后执行。可以看到Boost已经成功的编译好了。
2026-01-25 22:06:57
50
原创 Openssl:完成base64编解码
也就是:base64_len = ( strlen(str_in)/3 + 1) * 4;注:base64编码后的字符串长度的计算方法为:向上取整(原始字节数 / 3) * 4。编译时需要加上链接库参数:-lssl -lcrypto。
2026-01-24 22:55:35
11
原创 ReadMe:分类数字说明
Linux,有4篇文章无法加入Linux开发,可以通过:进行检索。Linux开发,有6篇文章无法分类到子专栏,可以通过:进行检索。
2026-01-24 22:31:46
110
原创 C++(23):views::zip
这也就是names.size()=4, zipped size follows the shorter ages.size()=3。2.views::zip 迭代得到的元素类型是“tuple-like”,基本上可以认为是tuple<T1&, T2&, ...>所以可以通过解构直接修改源数据,也就是上例age += 1最后确实修改了ages中的值。1.zip是是基于多个ranges中最短的那个作为输出的范围。当然如果源数据是const类型的,那是不能修改值的。
2026-01-23 11:19:58
227
原创 C++(23):views::enumerate
C++20增加了Ranges和Views,C++23又将此发扬光大,Ranges和Views已经到了相当可用的程度。
2026-01-23 10:37:09
26
原创 C++(23):flat_map
C++23引入了几个新的容器flat_{set | multiset | map | multimap},这些容器其实是通过连续内存保存的经过排序后的数据。咋一听起来感觉这个设计有点无用,因为使用map这类关联容器的优点就是可以快速的插入,删除,然后查找的效率也蛮好的。如果使用连续内存(像vector),那么插入和删除的效率必然很低,因为需要移动数据。1.flat_map占用的内存更少,因为map需要有额外的指针。1.频繁插入/删除/动态更新,因为flat_map是连续内存。2.遍历很快,因为是连续内存。
2026-01-22 17:44:09
32
原创 C++(23):获取异常的调用栈信息
1.traced_level1在调用链上抛出了traced_error,这个对象里面有一个trace成员,用于记录当时的调用栈信息,所以[A]输出可以看到完整的调用栈。3.如果是普通异常,也就是没有在抛出异常时记录trace,那么在catch时也是无法查看到抛出异常时的调用栈情况的。2.如果在catch处打印调用栈,只能看到被调用时的栈情况,无法看到抛出异常时的栈情况,参考[B]输出。4.使用stacktrace,编译的时候需要链接库-lstdc++exp。
2026-01-22 15:38:04
157
原创 C++(03):异常的处理路径
2.编译器在编译时生成异常处理所需的元数据/表(unwind + handler tables),而真正发生异常时,运行时从当前栈顶开始向外走(沿调用链往上),逐帧查询该帧的异常表,查找是否存在匹配的 handler(比如。说起来虽然写了很多年的C++,但其实对于异常使用的并不多,所以也没有好好的了解异常的处理路径。5.到达最终的处理点,完成处理后,程序会继续向下处理,比如调用了log_line("main: normal end");1.异常被抛出后,后面的代码不会被执行。
2026-01-21 16:37:47
20
原创 C++(20):通过atomic_ref原子操作自定义类型变量
aref.compare_exchange_weak将新值desired写回到state时,会比较state的当前值和expected是不是一致,也就是state是否发生了变化,如果成功了那么while (true)被break,如果没有,也就是别的现场已经把state改成了另外一个值,那么这时expected会被更新为最近的state值,然后重新通过while (true)完成新值desired的写入。生成了state的一个本地拷贝expected,再通过desired设置了新值(+1)后,通过。
2026-01-21 11:23:04
328
原创 C++(23):ranges::to
C++23为容器之间的转换提供了一个比较方便的方案,那就是ranges::to。可以看到通过ranges::to可以非常方便的完成容器间的转换。
2026-01-13 21:01:42
41
原创 C++(23):一种通用log模块的实现
2.common_api.h定义了一些辅助函数,其中最为重要的就是toStr,用于将各种数据结构转为string。1.log_out.h定义了log模块的主要功能,包括设置输出等级以及输出方法还有输出内容。可以看到,基本数据类型,容器,自定义数据类型,都可以直接通过logXXX函数进行直接输出。3.key_value,h用于定义自己的数据结构,演示如果把自定义类型输出为字符串。介绍了一种比较通用的log实现,但是需要使用nlohmann/json.hpp。4.main.cpp用于完成log模块的测试。
2026-01-12 10:35:19
26
原创 C++(23):将容器和自定义数据结构转换为string
可以看到通过to_string_fmt我们可以把容器和自定义类型都转换为string,甚至也包含容器和自定义类型的组合。可以通过print打印容器和自定义数据结构,那么那么有没有方法可以直接将其内容转换为string呢?
2026-01-11 13:05:26
206
原创 VSCode:SSH后无法使用c0pil0t
3.在打开的settings.json文件中添加如下字段。就可以发现c0pil0t可以在ssh的机器上使用了。1.VSCode按键盘ctrl+shift+p。4.重启VSCode。
2026-01-11 12:45:25
269
原创 Windows开发:Win11安装时没有办法连接wifi,如何跳过联网
4.电脑安装完成后,由于wifi驱动还是没有被setup起来,所以还是没有办法联网,这时我是通过网线连接到了路由器,然后在win11里完成:设置->Windows更新。3.电脑会重启,然后重新回到联网界面时,这时刚刚的联网界面就出现了跳过联网的按钮,可以点击,继续后面的安装设置。2.将光标移动到命令窗口中,然后输入:OOBE\BYPASSNRO,然后再按回车。1.在联网界面按【Shift+F10】或【Shift+Fn+F10】经过了几轮的更新后,win11就可以成功连接wifi了。这时会弹出一个命令窗口。
2026-01-08 09:15:55
272
原创 C++(23):返回右值引用时省略move
需要说明的是,虽然编译器允许省略move的操作,但也就仅此而已,不会为生命周期或引用悬挂多做任何事情,所以如果使用不当,还是会造成引用悬挂。C++20中,returnTest必须通过move(t)的方式返回,因为t本身是一个左值。比如下面的程序使用Test&& t1 = returnTest(Test(30));C++23,简化了return的语句,对于这种情况可以直接返回t。可以看到先完成了移动,然后调用的析构。
2026-01-04 22:15:12
39
原创 C++(11):函数的返回值可以是右值引用吗?
可以看到由于t1是定义在函数returnTest外的,在调用returnTest时,其生命期是完整的存在的,因此即使返回了右值引用,也没有什么问题。可以看到,返回的是临时对象内部成员的引用,引用本身会在语句结束后悬空,但是如果你“立刻把它 move 到一个值里”,是安全的。也就是用了一个空对象调用了移动构造函数,如果移动构造函数中对ori有访问,还是会报引用悬挂的错误。直白点说,右值引用也是引用,所以必须保证对他初始化时,所引用的对象还是存在的!func1的返回值,记作r1通过右值引用指向到了t。
2026-01-04 17:35:41
553
原创 C++(11):关于移动构造、std::move的几点说明
介绍了move可以把左值变成一个右值,但是很多人有个误区,就是有了这个转换就会调用移动构造,实际上并不是这样,move只是转变了变量做为左值还是右值得身份,至于这个右值怎么使用跟move没有关系,如果是做为移动构造的输入参数,像上例那样,那是会触发移动构造的。示例中,移动构造函数内部只是进行了打印,没有做任何移动操作,所以test2中的t2和t3是两个独立且完整的对象,甚至连value值都发生了变化,t2为30,而t3为10。然后temp会通过移动构造构造test1的函数返回值对象,记作tmp1。
2026-01-04 16:34:47
155
原创 C++(23):利用this参数实现lambda的递归调用
相当于重载了其operator运算符,加入了this参数,因此我们可以利用其完成递归调用。可以大致认为lambdaAdd与DoAdd的实现类似,只不过lambda是一个匿名类。所以实际上lambda也是一个类型,并且有其成员函数operator。因此可以利用this实现lambda的递归调用。
2026-01-02 14:27:24
194
原创 VSCode:编译C/C++多文件程序
2.将之前的${fileDirname}\\${fileBasenameNoExtension}.exe修改为${fileDirname}\\test.exe。基于之前的单文件程序,我们可以进行小的修改,从而完成多文件程序的编译。可以看到终端上输出了:Hello new World!也是跟之前已经得,只要设置好断点,就可以进行单步调试了。1.将之前的"${file}"修改为"*.cpp"1.修改.vscode/task.json。2.修改程序为多文件。方法跟之前是一样的,
2026-01-02 09:07:42
344
1
原创 VSCode:自动保存文件
3.设置Files:Auto Save为onFocusChange。VSCode可以设置文件离开焦点后自动保存文件。2.在设置的搜素里输入auto save。
2026-01-01 12:54:50
251
原创 VSCode:编译C/C++单文件程序
vscode会自动生成一个.vscode目录,目录中有一个文件task.json。然后选择第一个C/C++:gcc.exe 构建和调试活动文件...如果编译有错误,只需参考上面的task.json即可。并且在当前目录下生成了一个文件m.exe。单击代码要设置断点的地方。点击调试C/C++文件。
2026-01-01 10:36:23
251
原创 Win11:彻底卸载VSCode
C:\Users\<用户名>\AppData\Roaming\Code。C:\Users\<用户名>\.vscode。
2025-12-28 21:11:30
251
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅