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

 

主要用了我把它称之为“递归特化”(???)的东西

看代码应该能懂。

主要遇到的问题时一个点,若想要调用一个模板类的一个成员,且在该类是哪个特化未知的情况下,我们必须要支持每种特化都包含这个成员


差不多就是这样子

最后保留节目

 

 

posted @ 2021-12-14 00:25  CppinK  阅读(107)  评论(0编辑  收藏  举报