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

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

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

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

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

#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* 等任意类型,直接用|连接,自动拼接成完整字符串。

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

2. Cast响应式变量绑定

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

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仓库):

#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、求转发、求评论,你的支持就是我继续折腾的动力! ✨

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐