广告位联系
返回顶部
分享到

更优雅的C++字符串格式化实现方法介绍

C语言 来源:互联网 作者:佚名 发布时间:2023-10-27 22:40:24 人浏览
摘要

在用C++编写代码时,经常需要用到字符串拼接及格式化,尤其是在拼写sql语句时,目前大部分sql拼接方式都是通过ostringstream流一点一点拼接的,代码可读性很差而且很容易拼接错误 1

在用C++编写代码时,经常需要用到字符串拼接及格式化,尤其是在拼写sql语句时,目前大部分sql拼接方式都是通过ostringstream流一点一点拼接的,代码可读性很差而且很容易拼接错误

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

ostringstream sqlstr;

sqlstr << "insert into virtual_item_info(id, platform, typeid, name, icon_url, act_url, "

          "desc_text, vm_typeid, vm_price, val_typeid, val_count, priority, show_type, param, "

          "combo, area, "

          "onshelf_time, offshelf_time, status, show_url, svga_url, mp4_url, remarks_info, "

          "shading_url, utime, has_green_dot, act_id, "

          "act_name, act_icon, act_name_lang_id, act_start_time, act_end_time, item_level, "

          "distribute_src, buy_to_use_duration, noble_lvl, name_lang_id, desc_lang_id, "

          "target_whitelist_id, target_whitelist_type, is_cp_shareable, act_link_type, "

          "act_show_type, item_lang_code)"

       << "values(" << item.id << "," << item.platform << "," << item.atypeid << ",'"

       << EscapeString(item.name) << "','" << EscapeString(item.iconurl) << "','"

       << EscapeString(item.actUrl) << "','" << EscapeString(item.desctext) << "',"

       << item.vmtypeid << "," << item.vmprice << "," << item.valtypeid << "," << item.valcount

       << "," << item.priority << "," << item.showType << ",'" << EscapeString(item.param)

       << "'," << item.isCombo << ",'" << EscapeString(item.area) << "',"

       << item.onshelftime << "," << item.offshelftime << "," << item.status << ",'"

       << EscapeString(item.showUrl) << "','" << EscapeString(item.svgaUrl) << "','"

       << EscapeString(item.mp4Url) << "','" << EscapeString(item.remarksInfo)

       << "', '" << EscapeString(item.shadingUrl) << "', " << butil::gettimeofday_s()

       << "," << item.hasGreenDot << ",'" << EscapeString(item.actId) << "','"

       << EscapeString(item.actName) << "','" << EscapeString(item.actIcon) << "','"

       << EscapeString(item.actNameLangId) << "'," << item.actStartTime << ","

       << item.actEndTime << "," << item.itemLevel << "," << item.distributeSrc << ","

       << item.buyToUseDuration << "," << item.nobleLevel << ",'"

       << EscapeString(item.nameLangId) << "','" << EscapeString(item.descLangId)

       << "','" << EscapeString(item.targetGroupWhiteListId) << "',"

       << item.targetGroupWhiteListType << "," << item.isCpShareable << "," << item.actLinkType

       << "," << item.actShowType << ",'" << EscapeString(item.itemLangCode) << "')";

优化

参考python字符串格式化方式

1

"{} {}".format("hello", "world")

先写出完整的字符串,在需要替换的位置通过占位符{}保留, 最后将占位符替换为指定的参数

实现

本质是基于递归依次将字符转中的占位符{}替换为对应的参数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

class StringUtil {

private:

    // 递归出口

    static void BuildFormatString(std::ostringstream& builder,

                                  const std::string& fmt_spec,

                                  std::string::size_type idx) {

        builder.write(fmt_spec.data() + idx, fmt_spec.size() - idx);

    }

 

 

    template <typename T, typename... Types>

    static void BuildFormatString(std::ostringstream& builder,

                                  const std::string& fmt_spec,

                                  std::string::size_type idx,

                                  const T& first,

                                  const Types&... args) {

        auto pos = fmt_spec.find_first_of("{}", idx);a

        if (pos == std::string::npos) {

            builder.write(fmt_spec.data() + idx, fmt_spec.size() - idx);

            return;

        }

 

        builder.write(fmt_spec.data() + idx, pos - idx);

        builder << first;

        BuildFormatString(builder, fmt_spec, pos + 2, args...);

    }

 

public:

    /**

    * C++实现python风格字符串格式化

    */

    template <typename... Types>

    static std::string FormatString(const std::string& fmt_spec, const Types&... args) {

        std::ostringstream builder;

        BuildFormatString(builder, fmt_spec, 0, args...);

        return builder.str();

    }

};

使用

1

2

3

4

uint32_t ts = butil::gettimeofday_s();

string sql_formattor =

        "insert into tbl_user_relation_info(uid, gift_id, batch_id, relation_id, crc32_relation_id, status, peer_uid, relation_create_time, create_time, update_time, order_id) values({}, {}, {}, '', 0, 0, 0, 0, {}, {}, '{}')";

string sql = StringUtil::FormatString(sql_formattor, uid, giftId, batchId, ts, ts, orde


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • C++内存对齐的实现方法
    内存对齐的基本原则: 结构(struct/class)的内置类型数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的起始位置要从自身
  • 更优雅的C++字符串格式化实现方法介绍
    在用C++编写代码时,经常需要用到字符串拼接及格式化,尤其是在拼写sql语句时,目前大部分sql拼接方式都是通过ostringstream流一点一点拼接
  • C++模拟实现vector

    C++模拟实现vector
    一、迭代器 定义 vector类型的迭代器就是原生态的指针,对T*进行重命名即可 1 2 typedef T* iterator; typedef const T* const_iterator; 普通迭代器 1 2 3
  • C++模拟实现vector的方法教程
    一、迭代器 定义 vector类型的迭代器就是原生态的指针,对T*进行重命名即可 1 2 typedef T* iterator; typedef const T* const_iterator; 普通迭代器 1 2 3
  • C++实现读写ini配置文件的代码
    1.概述 配置文件的读取是每个程序必备的功能,配置文件的格式多种多样,例如:ini格式、json格式、xml格式等。其中属ini格式最为简单,且
  • C++20中的span容器及用法总结
    一.span容器 span是 C++20 中引入的一个新的标准容器,它用于表示连续的一段内存区间,类似于一个轻量级的只读数组容器。 span是一个轻量级
  • C++20中的std::span介绍
    span就是一个连续对象存储的观察者。类似std::string_view是string的观察者。 连续的存储,不一定是数组。例如: 1 2 3 4 5 6 7 8 zero(char (arr) [10]
  • C++11之std::future对象的使用以及说明

    C++11之std::future对象的使用以及说明
    std::future介绍 在前面几篇文章中基本都用到thread对象,它是C++11中提供异步创建多线程的工具。 但是我们想要从线程中返回异步任务结果,
  • C语言中#define在多行宏定义出错的原因及分析
    C语言中#define在多行宏定义出错的原因 1.第一种错误 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #includestdio.h #define echange(a,b) {\/*宏定义中允许包含多行命
  • vs2022 x64 C/C++和汇编混编(案例代码)

    vs2022 x64 C/C++和汇编混编(案例代码)
    vs2022环境x64 C/C++和汇编混编 vs64位程序不支持__asm内嵌汇编,需要单独编写汇编源文件 示例如下 1、新建空的win32项目,新建main.cpp,示例代码
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计