Example 5: 另一种print的方法,把一系列的数放到tuple这个类包里面依次打印;用到方法function template + class template + variadic templates
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
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;
}
解释上述的代码:
TupleTail(tail...) //调用父类的构造函数,并传递参数tail...,并非创建临时对象
TupleTail& getTail() {return *this}; //子类强制转换为父类,转换之后便失去了子类的特性
tuple<int, float, string> t(1, 6.3, ocean);
string在tuple包中仅占用一个指针的内存空间,该指针指向存储字符串的内存空间中,字符串占用的内存不算在tuple对象占用的内存。
创建一个tuple对象时内存的分配流程,递归继承的逻辑代码是否存储在代码段?我还不清楚
tuple<int, float,string> int head(1) -> tuple<float,string> float head(6.3) -> tuple<string> sting head("nico") -> tuple<>
Example 7: tuple采用另外一种方式,递归复合的方式把不同的类型的一系列参数组合成一个类
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 删除。