雪千渔Blog

  • 首页
  • 写写代码
    • dotNet
    • C++
    • Lua
    • Visual Basic
    • Java
    • Android
    • Web
  • DCC
    • Maya
    • Maya-Plug
    • AfterEffect
    • AfterEffect-Plug
    • PhotoShop-Plug
  • 游戏制作
    • Unity3D
    • UnrealEngine
    • 经验杂谈
    • 游戏设计
    • 自研引擎
    • 效果实现
  • 其他
    • 乱七八糟
    • 软件工具
    • 留言板
    • 自制素材
    • 关于我
  • 世界的尽头
雪千渔blog
唯有热爱,能抵漫长岁月
  1. 首页
  2. Coding
  3. C++
  4. 正文

C++变长模板递归实现多字符串Concat

2021年6月11日 358点热度 3人点赞 0条评论

Concat使用变长的参数模板来接受不同的字符串(string, const char*),为了保证string不会多次分配空间,要先求出所有字符长度之和,分配空间后在依次添加。

变长求和函数:

static int _Sum() { return 0; }
template<typename T, typename... TArgs>
static int _Sum(T t, TArgs... args) { return t + _Sum(args...); }

调用_Sum时,第一个参数会适配T,剩下的作为参数包适配TArgs,直到参数包为空时调用普通的_Sum函数结束递归。

在准备两个版本的求字符串长度的重载。

static size_t Size(const string& str) {
    return str.size();
}
static size_t Size(const char* str) {
    return ::strlen(str);
}

对参数包进行函数执行和展开,Size会求出每个字符串的大小后变成一个参数包,在把此参数包传入_Sum,_Sum进行递归求和后返回,在对string预分配内存。
template<typename... T>
static string Concat(const T&... args) {
    size_t size = _Sum(Size(args)...);
    string str;
    str.reserve(size + 1);
    return str;
}

然后就是为这个分配了内存的string填充参数包的内容,同样,声明两个字符串版本的添加。
static void _AppendStr(string& str, const char* nstr)
{
    str.append(nstr);
}
static void _AppendStr(string& str, const string nstr)
{
    str.append(nstr.c_str());
}

像上面的变长求和一样,进行递归添加,每次递归把参数包的一个参数添加,然后对剩下的参数包继续传递递归。
static void _Append(string& str) {}

template<typename T, typename... TArgs>
static void _Append(string& str, const T& nstr, TArgs&&... args)
{
    _AppendStr(str, nstr);
    _Append(str, args...);
}

完整的Concat函数
template<typename... T>
static string Concat(const T&... args) {
    size_t size = _Sum(Size(args)...);
    string str;
    str.reserve(size + 1);
    _Append(str, args...);
    return str;
}

 

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: C# 字符串 模板
最后更新:2021年6月11日

JomiXedYu

一名游戏玩家。

点赞
< 上一篇
下一篇 >

文章评论

取消回复

*

code

JomiXedYu

一名游戏玩家。

分类
  • AfterEffect / 6篇
  • AfterEffect-Plug / 1篇
  • Android / 1篇
  • C++ / 10篇
  • dotNet / 12篇
  • Lua / 4篇
  • Maya / 2篇
  • Maya-Plug / 1篇
  • Office-VSTO&VBA / 2篇
  • Unity3D / 14篇
  • Visual Basic / 8篇
  • Web / 2篇
  • 乱七八糟 / 2篇
  • 效果实现 / 2篇
  • 经验杂谈 / 2篇
  • 自制素材 / 3篇
  • 计算机图形学 / 1篇
  • 软件工具 / 4篇
友情链接
  • DorinXL
  • 小博博客
  • 秋橘斋

COPYRIGHT © 2014-2021 雪千渔Blog. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

辽ICP备20006894号-1