c++变长模板参数替代c变长参数

描述

大家在写c++代码的时候,肯定遇见过很多c遗留代码,自己还总想把c遗留代码改为新标准的正宗的c++代码,今天我带大家解决一个c遗留代码,就是变长参数列表,形如下述代码,我们想要获得的参数拼接成一个字符串,然后返回拼接完的字符串,就是没有了解过c变长参数和不熟悉变长参数的,看着懵逼吧,不知道这玩意是干啥的吧,什么 v a _ l i s t   v a _ s t a r t   v a _ e n d va\_list\ va\_start\ va\_end va_list va_start va_end,干啥用的,真恶心,okok,我们这篇文章就是来解决这个c变长参数,用c++的变长模板来实现这个变长参数拼接。

#define BUFFER_LENGTH 1024
string someFunc(int level,const char *format,...)
{
    va_list valist;
    va_start(valist,format);
    char temp[BUFFER_LENGTH];
    int m = vsnprintf(temp,BUFFER_LENGTH-1,format,valist);
    va_end(valist);
    return string(temp);
}

下述代码就解决了c风格变长参数的问题,使用c++的变长模板参数实现的,这里对于变长参数不用再使用c的什么 v a _ l i s t   v a _ s t a r t   v a _ e n d va\_list\ va\_start\ va\_end va_list va_start va_end了,完全不需要了,我们直接写一个展开函数,不断地展开、拼接,最后得到所有参数的拼接,这里需要使用编译期条件判断,在下述函数 f u n fun fun里面,其实我也能猜到,看下面的代码也懵逼吧,甚至比上述的代码还优点懵是吧,其实也正常,c++吗,出名的难,一些新特性更是劝退,但是还是要学的吗,毕竟我们学c++的要尽量的把c风格转向c++新标准风格,一点点学呗。先把下面的代码吃透。

template <typename T,typename... Args>
void fun(std::string &result,const T &t,const Args&... args)
{
    if constexpr (std::is_constructible<std::string,T>::value)
        result += t;
    else
        result += std::to_string(t);
    if constexpr (sizeof...(args) >= 1)
        fun(result,args...);
}
template <typename T,typename... Args>
string someFunc(int level,const T &val,const Args&... args)
{
    string ans = "";
    fun(m_buf,val,args...);
    return ans;
}
  • 15
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值