デフォルトのテンプレート引数
関数のデフォルト引数を提供するのと同じように、テンプレートのデフォルト引数も提供できます。新しい標準では、関数とクラステンプレートのデフォルト引数を提供できます。以前のC ++標準では、クラステンプレートの実際のパラメータしか提供できませんでした。
compareを書き直し、デフォルトで標準ライブラリの関数の少ないオブジェクトテンプレートを使用します。
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を設定します
デフォルトのクラスを設定して試してみましょう
#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
前述のように、ファイルで定義する必要があります