index 可变模板展开

https://www.zhihu.com/question/51253466

#include <iostream>

#include <fstream>

#include <memory>

#include <iterator>

#include <type_traits>

#include <cstdlib>

#include <memory>

#include <cxxabi.h>

#include <type_traits>

#include <typeinfo>

#ifndef _MSC_VER

#   include <cxxabi.h>

#endif

#include <memory>

#include <string>

#include <cstdlib>

template <class T>

std::string type_name()

{

typedef typename std::remove_reference<T>::type TR;

std::unique_ptr<char, void(*)(void*)> own

(

#ifndef _MSC_VER

abi::__cxa_demangle(typeid(TR).name(), nullptr,

nullptr, nullptr),

#else

nullptr,

#endif

std::free

);

std::string r = own != nullptr ? own.get() : typeid(TR).name();

if (std::is_const<TR>::value)

r += " const";

if (std::is_volatile<TR>::value)

r += " volatile";

if (std::is_lvalue_reference<T>::value)

r += "&";

else if (std::is_rvalue_reference<T>::value)

r += "&&";

return r;

}

using namespace std;

std::string demangle(const char* name);

inline std::string demangle(const char* name)

{

int status = -4;

std::unique_ptr<char, void(*)(void*)> res

{

abi::__cxa_demangle(name, NULL, NULL, &status),

std::free

};

return (status==0) ? res.get() : name ;

}

template<int...>

struct IndexSeq {};

template<int N, int... Indexes>

struct MakeIndexes : MakeIndexes<N - 1, N - 1, Indexes...>

{

MakeIndexes()

{

Init(demangle(typeid(this).name()));

}

void Init(std::string id)

{

std::cout<<"Creating "<<id<<std::endl;

}

};

template<int... indexes>

struct MakeIndexes<0, indexes...>

{

typedef IndexSeq<indexes...> type;

MakeIndexes()

{

Init(demangle(typeid(this).name()));

}

void Init(std::string id)

{

std::cout<<"Creating "<<id<<std::endl;

}

};

int main()

{

MakeIndexes<3> a;

MakeIndexes<3>::type b;

std::cout<<"*************************************"<<std::endl;

std::cout<<type_name<decltype(a)>()<<std::endl;

std::cout<<type_name<decltype(b)>()<<std::endl;

}

[[email protected]_99_227_centos dev]# ./a.out

Creating MakeIndexes<0, 0, 1, 2>*

Creating MakeIndexes<1, 1, 2>*

Creating MakeIndexes<2, 2>*

Creating MakeIndexes<3>*

*************************************

MakeIndexes<3>

IndexSeq<0, 1, 2>

继承关系:

MakeIndexes<3> :  MakeIndexes<2, 2>

MakeIndexes<2, 2> : MakeIndexes<1,1,2>

MakeIndexes<1,1,2>: MakeIndexes<0, 0,1,2>

时间: 2025-01-10 21:03:12

index 可变模板展开的相关文章

C++模板之可变模板参数

可变模板参数---- C++11新特性 可变模板参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数 由于可变模版参数比较抽象,使用起来需要一定的技巧,所以它也是C++11中最难理解和掌握的特性之一 参数包(parameter pack) 模板参数包,如: template<typename- Args>class tuple; Args标识符的左侧使用了省略号,在C++11中Args被称为"模板

利用可变模板参数实现log功能

在以前的博文中,写过类似的课题.使用的是下面这种方法. // 递归出口 template <typename T> void logOld(const T& t) { std::cout << t << '\n'; } // 递归展开 template <typename T, typename ... Args> void logOld(const T& t, const Args& ... args) { std::cout &l

【Halcon示例001---varaition_model_single】 利用单张图像创建可变模板

1 * 2 * This example shows how to employ the new extensions of HALCON's variation model operators 3 * to perform customary print quality tests. 4 * In this example the variation model is built upon a single reference image. 5 * The example consists o

C++ 11 可变模板参数的两种展开方式

#include <iostream> #include <string> #include <stdint.h> template<typename T> T Sum(T t) { std::cout << t << " = "; return t; } template<typename T, typename... Args> T Sum(T head, Args...args) { std::c

index.html 模板

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"

C++ 遍历可变模板参数 iterate variadic template arguments

1 template<size_t I = 0, typename FuncT, typename ...Tp> 2 inline typename std::enable_if_t<I == sizeof ...(Tp)> for_each(std::tuple<Tp ...>&, FuncT) 3 { 4 } 5 6 template<size_t I = 0, typename FuncT, typename ...Tp> 7 inline t

可变参数模板

一.基本语法 声明一个带有可变参数个数的模板的语法如下所示: template<typename ...Element> class tuple; tuple<int, string> a;  // use it like this 在模板参数 Element 左边出现省略号 ... ,就是表示 Element 是一个模板参数包(template type parameter pack).parameter pack(参数包)是新引入 C++ 中的概念,比如在这个例子中,Eleme

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

在c++11之前,类模板和函数模板只能含有固定数量的模板参数,c++11增加了可变模板参数特性:允许模板定义中包含0到任意个模板参数.声明可变参数模板时,需要在typename或class后面加上省略号"...".     省略号的作用有两个: 1. 声明一个参数包,这个参数包中可以包含0到任意个模板参数 2. 在模板定义的右边,可以将参数包展开成一个一个独立的参数 1. 可变参数模板函数 可变参数模板函数的定义如下: template<class... T> void f

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

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