Эссе части шаблона C ++ (3) параметры шаблона

Аргументы шаблона по умолчанию

Так же, как мы предоставляем аргументы по умолчанию для функций, мы также можем предоставить аргументы по умолчанию для шаблонов.В новом стандарте мы можем предоставлять аргументы по умолчанию для функций и шаблонов классов. Более ранний стандарт C ++ позволял нам предоставлять фактические параметры только для шаблонов классов.

Мы переписываем compare и по умолчанию используем шаблон less function object из стандартной библиотеки:

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;
}

Итак, мы установили тип шаблона по умолчанию int для F

Давайте установим класс по умолчанию и попробуем

#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, с использованием типа удаления по умолчанию, наш класс будет содержать перегруженный оператор вызова функции, который получает указатель и выполняет удаление по этому указателю. В отличие от средства удаления по умолчанию, наш класс также будет печатать сообщение при выполнении удаления. Поскольку мы хотим, чтобы средство удаления было применимо к любому типу, мы определяем оператор вызова как шаблон:

#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

Как упоминалось ранее, он должен быть определен в файле

рекомендация

отblog.csdn.net/qq_32783703/article/details/104715140
рекомендация