c++ 模板部分随笔(三) 模板参数

默认模板实参

就像我们为函数提供默认的实参一样,我们也可以提供模板默认的实参,在新的标准中,我们可以为函数和类模板提供默认的实参。而更早的c++标准只允许我们为类模板提供实参。

我们重写compare,默认使用标准库的less函数对象模板:

template <typename T,typename F = int>
int compare(const T &v1, const T &v2,F a)
{
    printf("%d\n",a);
}

int main()
{
    compare(1,2,3);
    return 0;
}

这样我们就给F设置了一个默认的模板类型int

我们再来设置一个默认的class 试一下

#include <memory>
#include <cstring>
#include <vector>

#include <iostream>
//#include "template.h"

class A{
public:
    int a;
    A(){
        this->a = 3;
        std::cout<<"__construct"<<std::endl;
    }
    ~A()
    {
        std::cout<<"__destruct"<<std::endl;
    }
};

template <typename T,typename F = A>
int compare(const T &v1, const T &v2,F a)
{
    printf("%d\n",a.a);
}

int main()
{
    A data;
    compare(1,2,data);
    return 0;
}

16.1.4成员模板

一个类,可以包含本身是模板的成员函数,这种成员被称为成员模板。成员模板不能是虚函数。

普通(非模板类的成员模板)

作为普通类包含成员模板的例子,我们定义一个类,类似unique_ptr使用默认删除器类型,我们的类将包含一个重载的函数调用运算符,它接收一个指针并对此指针执行delete。与默认删除器不同,我们的类还将在删除其被执行时候打印一条信息。由于希望删除器适用于任何类型,我们将调用运算符定义为一个模板:

#include <memory>
#include <cstring>
#include <vector>

#include <iostream>
//#include "template.h"

class A{

};

class DebugDelete{
public:
    DebugDelete(std::ostream &s = std::cerr):os(s){

    }

    template <typename T> void operator()(T *p) const
    {
        os << "deleteing unique_ptr"<<std::endl;
    }

private:
    std::ostream &os;
};


int main()
{
    std::shared_ptr<A> data = std::make_shared<A>();
    int* a = new int(3);
    DebugDelete() (&data);
    return 0;
}

类模板的成员模板

对于类模板 我们也可以为其定义成员模板。在这种情况下,类和成员各自有各自独立的模板参数

与类模板的普通函数不同,成员模板是函数模板。当我们在类模板外面定义一个成员模板的时候,必须同时为类模板和成员模板提供参数列表。类模板的参数列表在前,后面跟成员自己的模板参数列表。

//
// Created by root on 20-2-27.
//

#ifndef TEST_TEMPLATE_H
#define TEST_TEMPLATE_H
#include <vector>
#include <iostream>
// Created by root on 20-2-27.
//

template <typename T>class A{
public:
    template <typename It>
    A(It b,It e);
};

template <typename T>
template <typename It>
A<T>::A(It b,It e)
{

}

#endif //TEST_TEMPLATE_H

前面已经说过了必须定义在一个文件内

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章