【C++原创开源】formort.h:一行头文件,实现比JS模板字符串更爽的链式拼接+响应式变量

文章目录

大家好,我是董翔(GitHub:dxiangwiki),一个沉迷C++、喜欢折腾语法糖的开发者。

相信很多C++开发者都和我一样,羡慕JS里的模板字符串------不用写一堆<<,不用记占位符,变量直接嵌在字符串里,写起来像说话一样自然。但C++原生并没有这种语法,要么用cout <<把句子切碎,要么用std::format写占位符,总觉得不够丝滑。

于是我自己动手,写了一个超轻量的头文件formort.h,只用1个文件、几十行代码,实现了「|链式字符串拼接」+「响应式变量绑定」,甚至比JS模板字符串更简洁、更强大!今天就把这个小工具分享给大家,开源免费,MIT协议,直接复制就能用~

一、先看效果:比JS模板字符串更爽的写法

先上核心示例,大家感受一下这种丝滑感:

cpp 复制代码
#include<iostream>
#include<string>
#include"formort.h"

int main() {
    int num = 16;
    std::string name = "我";
    Cast n = num; // 响应式绑定变量num

    // 链式拼接:字符串、变量、表达式直接用|连接
    std::cout << (name | num + 1 | "岁了,今天的幸运数字是" | 99) << std::endl;
    
    // 响应式测试:修改原变量,拼接结果自动更新
    num = 20;
    std::cout << (name | n | "岁了,今天的幸运数字是" | 99) << std::endl;
    return 0;
}

输出结果:

复制代码
我17岁了,今天的幸运数字是99
我20岁了,今天的幸运数字是99

对比一下传统写法和JS模板字符串,差距一目了然:

  • C++原生写法:cout << "我" << num + 1 << "岁了...";(句子被切碎,可读性差)
  • JS模板字符串:我${num+1}岁了...(需要写${},且不支持响应式)
  • formort.h写法:(name | num + 1 | "岁了...")(无多余符号,支持响应式,更简洁)

二、核心功能:不止是拼接,还有响应式

这个工具的核心优势的就是「轻量、简洁、强大」,全程零依赖,只需要引入一个头文件,支持所有C++11及以上版本,主要有两个核心功能:

1. 任意类型|链式拼接

无需手动转换类型,字符串、int、float、double、const char* 等任意类型,直接用|连接,自动拼接成完整字符串。

cpp 复制代码
// 支持各种类型混搭
std::string str = "数值:" | 100 | ",浮点数:" | 3.14 | ",布尔值:" | true;
// 结果:数值:100,浮点数:3.14,布尔值:1

2. Cast响应式变量绑定

这是我最满意的功能!用Cast类绑定任意变量,后续修改原变量,所有用到该绑定变量的拼接,都会自动更新结果------这一点,连JS模板字符串都做不到(JS模板字符串是一次性计算,变量修改后不会自动更新)。

cpp 复制代码
int a = 5;
Cast bindA = a;

// 第一次拼接
std::cout << ("a的值是:" | bindA) << std::endl; // 输出:a的值是:5

// 修改原变量
a = 10;

// 无需重新拼接,直接输出,结果自动更新
std::cout << ("a的值是:" | bindA) << std::endl; // 输出:a的值是:10

三、核心实现:几十行代码,看懂原理

很多同学可能好奇,这个功能是怎么实现的?其实核心就是「运算符重载」+「模板类+引用」,代码非常简洁,几十行就能看懂,这里贴出核心代码(完整代码在GitHub仓库):

cpp 复制代码
#ifndef FORMORT_H
#define FORMORT_H

#include<string>

// 重载|运算符,拼接string和string
inline std::string& operator|(std::string& os, std::string c) {
	os += c;
	return os;
}

// 重载|运算符,拼接string和const char*
inline std::string& operator|(std::string& os, const char* c) {
	os += c;
	return os;
}

// 模板重载|运算符,支持任意可转换为string的类型(int、float等)
template<typename T>
inline std::string& operator|(std::string& os, T c) {
	os += std::to_string(c);
	return os;
}

// 响应式绑定类:用引用绑定原变量,通过隐式类型转换实现无缝使用
template<typename T>
class Cast {
	T& YourVar; // 关键:引用绑定,不拷贝,实现响应式
public:
	Cast(T& t) : YourVar(t) {}
	operator T(){ // 隐式类型转换,自动转回原类型
		return YourVar;
	}
};

#endif

核心原理拆解:

  1. 运算符重载:重载|运算符,让其实现字符串拼接功能,返回自身引用,支持链式调用;
  2. 模板适配:用模板函数适配任意类型,自动调用std::to_string转换为字符串,无需手动处理类型;
  3. 响应式实现:Cast类用引用绑定原变量,通过隐式类型转换,让绑定后的变量可以像原变量一样使用,且原变量修改后,绑定变量会同步更新。

四、使用方法:零门槛,直接上手

使用方法超级简单,只有3步:

  1. 从GitHub仓库下载formort.h头文件;
  2. 在你的C++项目中,引入该头文件(#include "formort.h");
  3. 直接用|拼接任意类型,用Cast绑定变量实现响应式。

支持所有C++11及以上版本,兼容Windows、Linux、Mac等所有平台,零依赖,无需编译,直接复制使用。

五、开源仓库地址(求Star ✨)

这个小工具已经开源到GitHub,MIT协议,大家可以自由下载、使用、修改,也欢迎大家提交PR,一起完善它~

🔗 GitHub仓库地址:https://github.com/dxiangwiki/formort

仓库里包含完整的formort.h头文件、README说明、示例代码,还有MIT开源协议,大家可以直接克隆到本地使用。

六、最后想说的话

其实最开始做这个工具,只是因为自己嫌弃C++字符串拼接太麻烦,羡慕JS的模板字符串,想自己造一个"更爽"的写法。没想到写着写着,不仅实现了拼接功能,还意外做出了JS都没有的响应式绑定。

作为一个C++开发者,我始终觉得,技术的乐趣就在于"折腾"------把繁琐的事情变得简单,把不完美的体验变得丝滑。这个formort.h虽然简单,但却是我自己一点点摸索、调试出来的,希望能帮到和我一样喜欢简洁写法的开发者。

如果这个工具对你有帮助,欢迎到GitHub给我点个Star,也欢迎在评论区交流讨论,提出你的改进建议~

我是董翔(dxiangwiki),后续会继续分享更多C++实用小工具和学习心得,感谢大家的阅读!

✨ 求Star、求转发、求评论,你的支持就是我继续折腾的动力! ✨

相关推荐
前端摸鱼匠2 分钟前
Vue 3 的v-bind合并行为:讲解v-bind与普通属性合并的规则
前端·javascript·vue.js·前端框架·ecmascript
REDcker24 分钟前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
James_WangA2 小时前
我给 AOI 设备装了一个 Agent,然后发现工具注册才是最难写的
架构·github
我命由我123452 小时前
Kotlin 开发 - lateinit 关键字
android·java·开发语言·kotlin·android studio·android-studio·android runtime
智者知已应修善业2 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
James_WangA2 小时前
产线上跑 Agent:LLM 挂了不是 500 错误,是停线
架构·github
Halo_tjn2 小时前
Java Set集合相关知识点
java·开发语言·算法
Linsk2 小时前
Java和JavaScript的关系真是雷峰和雷峰塔的关系吗?
java·javascript·oracle
当时只道寻常2 小时前
浏览器文本复制到剪贴板:企业级最佳实践
javascript
许彰午2 小时前
我手写了一个 Java 内存数据库(二):B+ 树的插入与分裂
java·开发语言·面试