12.14 关于template的学习
说是想要日更
上个大一事情一堆啊,后天或者说明天(雾)还有一场听说考试,感觉我要完了啊。
不管了,先把之前的想写的先补上。
以上是一些碎碎念
这是一条分割线
template的基本写法就不再赘述了,讲几个重点关注的点,和我研究出的一些玩意儿。
关于特化的语法
template<typename T1,typename T2> void foo(T1, T2); template<> void foo<int,int>(int x,int y){ return; }
模板函数不支持偏特化,只能全特化。做全特化时,template<>的模板参数列表为空。
template<typename T1,typename T2> class A; template<typename T> class A<T,int>{ };
类模板可以偏特化,偏特化前的typename T 可以看出参数列表可以与之前的名字不同。
这里还有一个特殊的例子,暂时忘了,明天再补上。
关于参数包
template<typename... T>
void foo(T... args);
有模板参数包,函数参数包两种。
模板参数包就有typename... T 定义类型参数包,T... args 定义非类型参数包
函数参数包的定义是T... args ,其中T时某个模板类型参数包
之后还搞了一下tuple的实现
直接先上代码
#ifndef TUPLE #define TUPLE #include<iostream> #include<cstdio> template<typename... Rest> class Tuple; template<> class Tuple<> { public: Tuple() = default; int Head = 0; int Father() { return 0; } }; template<typename... Rest> std::ostream& operator<<(std::ostream& os, Tuple<Rest...> t); template<typename First,typename... Rest> class Tuple<First,Rest...> :public Tuple<Rest...> { friend std::ostream& operator<< <First, Rest...> (std::ostream&, Tuple<First, Rest...>); using fa = Tuple<Rest...>; public: Tuple(First head, Rest... args) :Tuple<Rest...>(args...), Head(head) {}; private: First Head; fa& Father() { return *this; } }; template<typename... Rest> std::ostream& operator<<(std::ostream& os, Tuple<Rest...> t) { os << t.Head; if (sizeof...(Rest) > 1) os << t.Father(); return os; } #endif
主要用了我把它称之为“递归特化”(???)的东西
看代码应该能懂。
主要遇到的问题时一个点,若想要调用一个模板类的一个成员,且在该类是哪个特化未知的情况下,我们必须要支持每种特化都包含这个成员
差不多就是这样子
最后保留节目