当前位置: 首页 > java >正文

C++ 字符格式化输出

文章目录

  • 一、简介
  • 二、实现代码
  • 三、实现效果

一、简介

这里使用std标准库简单实现一个字符格式化输出,方便后续的使用,它有点类似Qt中的QString操作。

二、实现代码

FMTString.hpp

#pragma once#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <optional>
#include <random>
#include <type_traits>
#include <sstream>namespace FMT 
{void formatStream(std::stringstream& stream, char const* text) {stream << text;return;}/// <summary>/// 在编译时检测某个类型T是否支持通过 operator<< 输出到流(如std::stringstream)/// </summary>/// <typeparam name="T"></typeparam>template <class T>class IsStreamable {private:template <class TT>static auto test(int)-> decltype(std::declval<std::stringstream&>() << std::declval<TT>(),std::true_type());template <class>static auto test(...)->std::false_type;public:static bool const value = decltype(test<T>(0))::value;};/// <summary>/// 将任意类型的参数通过流操作符 << 转换为字符串流(std::stringstream)的内容/// </summary>/// <typeparam name="T"></typeparam>template <class T>class ArgToStream {public:static void impl(std::stringstream& stream, T&& arg) {stream << std::forward<T>(arg);}};/// <summary>/// 将格式字符串 text 中的 {} 占位符依次替换为传入的参数 arg, args...,并将结果写入 std::stringstream 流中/// </summary>/// <typeparam name="T"></typeparam>/// <typeparam name="...Args"></typeparam>/// <param name="stream"></param>/// <param name="text"></param>/// <param name="arg"></param>/// <param name="...args"></param>template <class T, typename... Args>void formatStream(std::stringstream& stream, char const* text, T&& arg,Args&&... args) {static_assert(IsStreamable<T>::value,"One of the args has no ostream overload!");for (; *text != '\0'; ++text) {if (*text == '{' && *(text + 1) == '}') {ArgToStream<T&&>::impl(stream, std::forward<T>(arg));formatStream(stream, text + 2, std::forward<Args>(args)...);return;}stream << *text;}stream << "\nFormat-Warning: There are " << sizeof...(Args) + 1<< " args unused.";return;}template <class... Args>std::string formatString(char const* text, Args&&... args) {std::stringstream stream;formatStream(stream, text, std::forward<Args>(args)...);return stream.str();}
}

main.cpp

// 标准文件
#include <iostream>
#include <string>#include "FMTString.hpp"int main(int, char** argv)
{std::string msg = FMT::formatString("Hello, {}! You have {} new messages.", "Alice", 5);std::cout << "Output:" << msg << std::endl;system("pause");return 0;
}

三、实现效果

http://www.xdnf.cn/news/5883.html

相关文章:

  • python学习笔记七(文件)
  • 分布式链路跟踪
  • lubuntu 系统详解
  • WebpackVite总结篇与进阶
  • Java SpringMVC 和 MyBatis 整合项目的事务管理配置详解
  • DeepSeek 赋能汽车全生态:从产品到服务的智能化跃迁
  • 2025年5月13日第一轮
  • vue3父子组件传值
  • 数据治理域——日志数据采集设计
  • c++STL-list的模拟实现
  • conda 输出指定python环境的库 输出为 yaml文件
  • K230 ISP:一种新的白平衡标定方法
  • AcroForm 格式化文本(域)字段
  • ElasticSearch父子关系数据建模
  • MySQL命令行导出数据(docker版本)
  • 运行Spark程序-在shell中运行1
  • 智源联合南开大学开源Chinese-LiPS中文多模态语音识别数据集
  • base64形式的图片数据保存方法
  • Redis介绍与使用
  • 【git】clone项目后续,github clone的网络配置,大型项目git log 输出txt,切换commit学习,goland远程,自存档
  • 关于maven的依赖下不下来的问题
  • Git基本操作命令
  • 专题四:综合练习( 找出所有子集的异或总和再求和)
  • 解锁Python TDD:从理论到实战的高效编程之道(9/10)
  • 时间序列预测建模的完整流程以及数据分析【学习记录】
  • 选择单例还是依赖注入
  • 【每天一个知识点】Dip 检验(Dip test)
  • CSS经典布局之圣杯布局和双飞翼布局
  • spark-cache模式
  • ubuntu22.04编译PX4无人机仿真实践