C++11 可变参数模板构造string列表

#include <iostream>
#include <cstdint>
#include <list>
#include <string>

template<typename T>
typename std::enable_if<std::is_integral<T>::value, std::string>::type to_string(const T & val)
{
        return std::to_string(val);
}
template<typename T>
typename std::enable_if<std::is_floating_point<T>::value, std::string>::type to_string(const T & val)
{
        return std::to_string(val);
}
template<typename T>
typename std::enable_if<std::is_enum<T>::value, std::string>::type to_string(const T & val)
{
        return std::to_string(val);
}
std::string to_string(const std::string & val)
{
        return val;
}
std::string to_string(char * val)
{
        return val;
}

template<typename T>
void build_str_list(std::list<std::string> & ret, const T & val)
{
        ret.push_back(to_string(val));
}

template<typename T, typename... Args>
void build_str_list(std::list<std::string> & ret, const T & head, Args&&... args)
{
        ret.push_back(to_string(head));
            build_str_list(ret, args...);
}

template<typename... Args>
std::list<std::string> build_string_list(Args&&... args)
{
        std::list<std::string> ret;
        build_str_list(ret, args...);
        return ret;
}

int32_t main()
{
    int16_t a = 1;
    uint16_t b = 2;
    int32_t c = 3;
    int64_t d = 4;
    uint32_t e = 5;
    uint64_t f = 6;
    std::string str = "thank";
    const char * you = "you";
    char buf[32] = "asd";
    enum
    {
       ENUM_A = 1002,
    };
    std::list<std::string> ret = build_string_list(12, "hehe", a, b, c, d, e, f, str, you, ENUM_A, "2323323", buf);
    for (const std::string & str : ret)
    {
      std::cout << str << std::endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/tangxin-blog/p/9295710.html

时间: 2024-08-21 18:52:36

C++11 可变参数模板构造string列表的相关文章

C++ 11 可变参数模板和 boost::any 实现可变参数函数

1 class SqlHelper 2 { 3 public: 4 template <typename... Params> 5 static bool preparedExecute(sql::PreparedStatement* pstmt, Params... parameters) 6 { 7 return doPreparedExecute(pstmt, 1, parameters...); 8 } 9 10 private: 11 template <typename...

c++11 可变参数模板函数

c++11 可变参数模板函数 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <vector> #include <map> // 在C++11之前,类模板和函数模板只能含有固定数量的模板参数.C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板. // 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变

c++11可变参数模板的使用1

1.概述 C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数.相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进.然而由于可变模版参数比较抽象,使用起来需要一定的技巧,所以它也是C++11中最难理解和掌握的特性之一. 虽然掌握可变模版参数有一定难度,但是它却是C++11中最有意思的一个特性,本文希望带领读者由浅入深的认识和掌握这一

C++反射机制:可变参数模板实现C++反射

1. 概要   本文描述一个通过C++可变参数模板实现C++反射机制的方法.该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能.Nebula框架在coding.net的仓库地址.   C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数.关于可变参数模板的原理和应用不是本文重点,不过通过本文中的例子也可充分了解可变参数模板是如何应用的.

第21课 可变参数模板(2)_展开参数包

1. 可变参数模板函数 (1)递归函数方式展开参数包 ①一般需要提供前向声明.一个参数包的展开函数和一个递归终止函数. ②前向声明有时可省略,递归终止函数可以是0个或n个参数 (2)逗号表达式和初始化列表方式展开参数包 ①逗号表达式按顺序执行,返回最后一个表达式的值. ②initilizer_list可接受任意多个不同类型的参数. ③借助逗号表达式来展开包,并将返回的结果用于初始化initilizer_list. [编程实验]展开可变参数模板函数的参数包 #include <iostream>

(转载)你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)

你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11) 3.5.2  字符串类型 使用char类型的变量我们可以表示单个字符,那么,我们又该如何表示拥有多个字符的字符串呢? 我们注意到,一个字符串是由多个字符串连起来形成的.很自然地,一种最简单直接的方法就是利用数组(一种数据组织管理方式,它将多个相同类型的数据元素组织起来,形成一个数据序列以便于访问.更多可以参考后文3.6小节对数组的介绍)来保存一个字符串中的各个字符,最后用一个特

char数组构造string

这是一个老掉牙的话题, 但是你稍加不注意就会出错. 最近在写一个可以跨平台打印的程序,就遇到这个问题,故记之.共勉! 用 char 数组初始化string #include <string> using std::string; using std::cout; int main(int argc, const char * argv[]) { char chArray[] = {'m', 'a', 'r', 'k'}; cout << "array size = &qu

可变参数模板用法

//可变参数模板 //可变参数模板,可以创建可接受可变数量参数的模板函数和模板类 //本程序通过模板函数来实例一下可变参数模板的基本用法 #include<iostream> using namespace std; void one(){}//当最后一个参数传完后,需要一个无参的重载版本 template <typename T>//当只剩最后一个参数时,编译器优先选择此模板,这样最后一个输出后面就没有逗号了 void one(T v) { cout << v <

C++11中的raw string literals

作为一名C++书看得少得可怜的新手,我一直没有勇气去系统地学习一下C++ 11添加的新特性.不过,平日里逛论坛,阅读大犇们的博客,倒是了解了一些.比如,这个帖子: 如何绕过g++ 4.8.1那个不能在宏里面使用R"(...)"的bug? 看到形如:R"" 这样的写法,相信学过Python的童鞋会感到似曾相识.Python支持所谓的“raw string”.Python文档这样介绍raw string: Both string and bytes literals m