前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Example 5, 6, 7 of variadic templates

Example 5, 6, 7 of variadic templates

原创
作者头像
ocean@32
修改2022-11-06 17:06:52
2930
修改2022-11-06 17:06:52
举报
文章被收录于专栏:C++ STL和泛型编程

Example 5: 另一种print的方法,把一系列的数放到tuple这个类包里面依次打印;用到方法function template + class template + variadic templates

代码语言:c++
复制
template<typename... args>
ostream& << (ostream os, const tuple<Args...>& t) {
	os << "[";
	PrintTuple<0, sizeof(Args...), Args...>::print();
	os << "]"
}

template<int IDX, int MAX, typename... Args>
struct PrintTuple {
	static void print(ostream os, const tuple<Args...>& t) {
		os << get<IDX>(t) << (IDX + 1 == MAX?"":",");
		PrintTuple<IDX+1, MAX, Args>::print();
	}
}
//特化类PrintTuple用于结束循环
template<int MAX, typename... Args>
struct PrintTuple<MAX, MAX, Args...>
	static void print(ostream os, const tuple<Args...>& t) {
	}
}

Example 6: class template + variadic templates -> tuple

代码语言:c++
复制
template<> class tuple<>{}

template<typename Head, typename... Tail>
class tuple<Head, Tail...> : private tuple<Tail...> {
 typedef tuple<Tail...> TupleTail;
 tuple(Head begin, Tail... tail) : head(begin), TupleTail(tail...){} 
 Head getHead() {return head};
 TupleTail& getTail() {return *this};
protected:
 Head head;
}

解释上述的代码:

代码语言:c++
复制
TupleTail(tail...)  //调用父类的构造函数,并传递参数tail...,并非创建临时对象
代码语言:c++
复制
TupleTail& getTail() {return *this}; //子类强制转换为父类,转换之后便失去了子类的特性
代码语言:c++
复制
tuple<int, float, string>  t(1, 6.3, ocean);

string在tuple包中仅占用一个指针的内存空间,该指针指向存储字符串的内存空间中,字符串占用的内存不算在tuple对象占用的内存。

创建一个tuple对象时内存的分配流程,递归继承的逻辑代码是否存储在代码段?我还不清楚

代码语言:c++
复制
tuple<int, float,string>  int head(1) -> tuple<float,string>  float head(6.3) -> tuple<string>  sting head("nico") -> tuple<>

Example 7: tuple采用另外一种方式,递归复合的方式把不同的类型的一系列参数组合成一个类

代码语言:c++
复制
template<> class tup<>{};    //这是最后一个复合的类型
template<typename Head, typename... Tail>
class tup< Head, Tail...> {
    typename tup<Tail...> TupTail;
protected:
    TupTail tupTail;
    Head head;
public:
    tup(){}
    tup(Head begin, Tail... tail):head(begin):tupTail(tail...){}
    Head getHead( ) const {return head;}
    TupTail& getTail() const {return tupTail;}
};

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档