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

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;
}

三、实现效果

相关文章:

  • Linux 系统安全基线检查:入侵防范测试标准与漏洞修复方法
  • 【递归、搜索与回溯】专题一:递归(二)
  • SparkSQL 连接 MySQL 并添加新数据:实战指南
  • 微服务八股(自用)
  • hashicorp vault机密管理系统的国产化替代:安当SMS凭据管理系统,量子安全赋能企业密钥管理
  • 软考软件测评师——计算机网络
  • 【Pandas】pandas DataFrame cummin
  • NC报销单保存时,报”保存失败:fail to save VO Array ~#@“
  • SQL中联表的运用
  • EXCEL下拉菜单与交替上色设置
  • ElasticSeach快速上手笔记-入门篇
  • 为什么 import _ “github.com/go-sql-driver/mysql“ 要导入但不使用?_ 是什么意思?
  • 中电金信参编的国家标准《信息技术 中间件 消息中间件技术要求》正式发布
  • 1.3 不确定性分析
  • 云蝠智能大模型呼叫优势:技术驱动全链路升级,重塑智能交互服务新体验
  • 【JavaScript】原生 JavaScript 实现 localStorage 过期时间
  • ubuntu----100,常用命令2
  • 裸机开发的核心技术:轮询、中断与DMA
  • 定制化项目变更通知延误、流程失控?日事清用条件分支判断规范跨部门协作与变更管理流程
  • STM32 __main
  • 美国明尼苏达州发生山火,过火面积超80平方公里
  • 山西省委常委李金科添新职
  • 朝着解决问题的正确方向迈进——中美经贸高层会谈牵动世界目光
  • 我国成功发射遥感四十号02组卫星
  • 三大股份制银行入局AIC,一级市场再迎“活水”
  • 伊美第四轮核问题谈判开始