首页 > 编程语言 >C++遍历TypeList(可变模板参数)的简单办法

C++遍历TypeList(可变模板参数)的简单办法

时间:2023-08-21 21:46:55浏览次数:47  
标签:Count 遍历 cout TypeList void C++ TPrintVariadicTemplateTypes printTypes

       这里例举了两种方案,一种是基于C++ 17的constexpr,实现起来更精简。另外一种使用传统的方式,C++ 11就可以用了。

       另外C++11的方案也是一种计算不定参数模板参数个数的方法。

#include <iostream>
#include <string>

// in C++ 17
#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
template <typename T, typename... ParamTypes>
void printTypes()
{
    std::cout << typeid(T).name() << std::endl;

    if constexpr (sizeof...(ParamTypes) > 0)
    {
        printTypes<ParamTypes...>();
    }
}
#else
// in C++ 11
template <typename T, typename... ParamTypes>
struct TPrintVariadicTemplateTypes
{
    enum 
    {
        Count = TPrintVariadicTemplateTypes<ParamTypes...>::Count + 1
    };

    void operator ()()
    {
        std::cout << typeid(T).name() << std::endl;

        TPrintVariadicTemplateTypes<ParamTypes...>()();
    }
};

template <typename T>
struct TPrintVariadicTemplateTypes<T>
{
    enum 
    {
        Count = 1
    };

	void operator ()()
	{
		std::cout << typeid(T).name() << std::endl;
	}
};

template <typename... ParamTypes>
void printTypes()
{
	TPrintVariadicTemplateTypes<ParamTypes...>()();
}

#endif

int main()
{
     printTypes<int>();
     printTypes<int, float, std::string>();
}

  

标签:Count,遍历,cout,TypeList,void,C++,TPrintVariadicTemplateTypes,printTypes
From: https://www.cnblogs.com/bodong/p/17647123.html

相关文章

  • C++ 字符串类 string
    @TOC前言在C++中,字符串是一种常见的数据类型,用于存储和操作文本数据。C++标准库中提供了std::string类,它是一个功能强大的字符串类,提供了丰富的方法和操作符,使我们能够轻松地处理字符串。一、string类型概括std::string是C++标准库中定义的字符串类,它在<string>头文件中声明。它......
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列(中等)
    题目:结合以下图理解该方法classSolution{//本题要点:二叉搜索树性质:根节点一定大于所有左子树,一定小于所有右子树public:booltraversal(vector<int>&postorder,intl,intr){//l和r分别为当前树的左右边界if(l>=r)returntrue;int......
  • C++基础-STL stack 栈
    stack栈1、特性在一端插入元素,在同一端删除元素,具有先进后出的特性。底层实现一般用list或deque,封闭头部即可,数据先进后出,不支持随机访问。2、适用情况需要一个先进后出结构时3、头文件#include<stack>4、复杂度插入:push(),O(1)删除:pop(),O(1)查找(栈顶):top(),O(1)5、定义及常用......
  • 北大ACM poj1050 To the Max(C++)
    TotheMaxTimeLimit:1000MS MemoryLimit:10000KTotalSubmissions:32446 Accepted:16930DescriptionGivenatwo-dimensionalarrayofpositiveandnegativeintegers,asub-rectangleisanycontiguoussub-arrayofsize1*1orgreaterlocatedwithi......
  • 8、C++ 继承
    参考资料:C++继承|菜鸟教程(runoob.com)面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。当创建一个类时,您不需要重新编写新的数据成员和成员函......
  • C++文档入口汇总
    一、C++参考手册(中文)cppreferencehttps://zh.cppreference.com/二、菜鸟教程(中文)https://www.runoob.com/cplusplus/cpp-tutorial.html三、C++的常用库及其文档:标准模板库(STL)提供了许多数据结构和算法,如向量、链表、队列、堆栈、映射和排序算法等。其中文文档链接:https://......
  • c++算法之哈希表
    啥是哈希表 哈希表,类似散列表,是一种存储数据的一种方式。只能说是有点奇葩。他是通过将值转换成数组的下标,也就是f[x]=x的意思,大家估计都能理解吧......
  • 4.5 C++ Boost 文件目录操作库
    Boost库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量、可移植、高效的C应用程序。Boost库可以作为标准C库的后备,通常被称为准标准库,是C标准化进程的重要开发引擎之一。使用Boost库可以加速C应用程序的开发过程,提高代码质......
  • 4.7 C++ Boost 多线程并发库
    Boost库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量、可移植、高效的C应用程序。Boost库可以作为标准C库的后备,通常被称为准标准库,是C标准化进程的重要开发引擎之一。使用Boost库可以加速C应用程序的开发过程,提高代码质......
  • 求先序,中序,后序等遍历中第k个结点的值
    代码自己想的,23年8月21没有仔细看王道书上的代码和自己写的有什么区别,测试应该是对的。但是如果k的值大于结点个数没有做判断#include<stdio.h>#include<stdlib.h>typedefstructTNode{intdata;structTNode*lchild,*rchild;}TreeNode,*Tree;voidCreate......