関数テンプレート
私たちは、内部の特殊機能として、テンプレートとして機能することができる任意のタイプにすることができ、パラメータの型関数テンプレートが自動的に様々な機能を収容することができ、パラメータの異なるタイプに適応するように、我々は定義された重複を減らすことができるようにすることを、パラメータの種類、例えばdouble
、int
あるいはどのようなクラス。
上記の機能を実現するためにC ++の導入template
この概念。私たちは、テンプレートパラメータの特殊なタイプであり、また機能のパラメータとして渡すことができ、それのように内部の心臓とすることができますint
ライン上に何がありますか。
型パラメータは、次のように関数テンプレートの形式は宣言しました。
template <class identifier> function_declaration;
template <typename identifier> function_declaration; // 这里使用了typename 当做声明类型参数
上記の文の書式テンプレート機能があること、唯一の違いでclass
、かつtypename
、実際には、ここでのC ++は、この厳格な区別をしませんでした使用の種類、彼らはライン上で見たい、違いはありません。
より良い次のように、大きい方の値を返す関数であるから、非常に鮮やかな例ではそれを与える、特定の文言を関数テンプレートを使用する方法を説明するために:
template <typename T>
T GetMax(T a, T b)
return a > b ? a : b;
上記のコード数行では、テンプレート関数は、ここで我々はまだ私の心にすることができ、ここでは特定のタイプを指定していない簡単にTを見て、二つの数値の間に大きな数を取得するために使用されて作成されました戻り値がTである、通常の変数処理と考えます
私たちのテンプレート関数の定義を使用するには、参照は、テンプレート関数呼び出しの形式を統一することができます。
function_name<type> (parameters); // type就是具体的类型,例如int、double这些,parameters就是函数里的参数,也是具体类型
我々は2つの大きな整数値へのアクセスを実現したい場合は、私たちが呼び出した後で、このint型を渡すことができますので、GetMax
機能を次のように、具体的な例は以下のとおりです。
int x = 4;
int y = 2;
int max = GetMax<int> (x, y); // max = 4
クラステンプレート
なぜならテンプレート宣言のタイプのものとすることができる任意のタイプの入線の特定のタイプを使用する場合、あります。あなたはクラステンプレートの上記の関数テンプレートの設定例を参照することができるようにライン上のクラスのこのタイプを使用するときと同じ、渡して特定の変数です。たとえば、以下のクラステンプレートの定義:
template <typename T>
class MyPair{
T value[2];
public:
MyPair(T first, T second)
{
value[0] = first;
value[1] = second;
}
};
サンプルコードテンプレートのクラス定義MyPair
、クラス二つの要素の任意のタイプを格納するために、例えばdouble
、char
、int
のような、二つの例は、私の下に与えられているが格納されdouble
、そしてint
タイプの可変
MyPair<int> myInt(2, 3); // 存储两个整型值
MyPair<double> myDouble(2.3, 3.43); // 存储两个double值
テンプレートクラスのメンバー関数をすることができるクラス外で定義書き込み、および書き込み機能テンプレートは同じであり、具体的な例を以下に示します。
template <class T>
class MyPair {
T a, b;
public:
mypair (T first, T second)
{a=first; b=second;}
T Getmax ();
};
template <typename T>
T MyPair<T>::Getmax () // 在类外定义函数, 注意前面的写法和函数模板写法一致
{
T retval;
retval = a>b? a : b;
return retval;
}
テンプレートの特殊化
私たちはクラステンプレートにしたい場合はインタフェースの異なる実装として定義され、特定のパラメータは、その後、私たちはすることができ、パラメータとして渡す必要が必要とされたテンプレートの特殊化。
優れたテンプレートの特殊化を示し、または単純な例を与えるために。我々は、クラスを定義するとmycontainer
、クラス、変数の任意の種類に格納され、このクラスは、呼び出された関数であることができるincreasement
ストレージの種類を追加します。このクラスの店がchar型の場合と、我々はそれが、この関数が定義されているかもしれない、より便利になります大文字の関数へのメンバ変数のいずれかを変換するために実装するには、このクラスを見つけるだろうToUpper
、我々はchar型のものとすることができるので、専門クラステンプレートのテンプレートを実現する以下のように、具体的な例のコードは次のとおりです。
// 模板特化
#include <iostream>
using namespace std;
// 声明类模板:
template <typename T>
class mycontainer {
T element;
public:
mycontainer (T arg) {element=arg;}
T increase () {return ++element;}
};
// char类型的模板特化:
template <>
class mycontainer<char> {
char element;
public:
mycontainer(char arg) {element=arg;}
char ToUpper()
{
if ((element>='a')&&(element<='z'))
element+='A'-'a';
return element;
}
};
上記の特別なテンプレートのために、私たちはクラステンプレートとのテンプレートの特殊化へのポイント、注意を払う必要がある違いとの接続を:
- クラステンプレートのフロントプラスでは
template <>
、テンプレートの特殊化を示し、それは、テンプレートの特殊化の必要性は、この文を追加すると言うことです。 - もう一つのポイントは、クラステンプレートの使用の後ろにいることである
<char>
パラメータ、この特定のパラメータは、我々が運転することをテンプレートクラスの特殊表し<char>
タイプ。
テンプレートのその他の用途
加えて、template
または内class
キーワードの宣言の先頭のタイプを示すテンプレートパラメータに加えて、テンプレートはまた、パラメータの他のタイプを持つことができ、例えばint
、double
複数のパラメータを持つ関数と同様、これらのパラメータは、各パラメータのタイプは同じではありません。より良好に説明するためにtemplate
他の用途が、それは、以下のサンプルコードを参照することができます
#include <iostream>
using namespace std;
template<class T, int N> // 这里除了含有class声明的类型之外,还拥有一个int类型
class mysequence {
T memblock [N];
public:
void setmember(int x, T value);
T getmember(int x);
};
template<class T, int N>
void mysequence<T,N>::setmember(int x, T value) {
memblock[x]=value;
}
template<class T, int N>
T mysequence<T,N>::getmember(int x) {
return memblock[x];
}
int main(){
mysequence<int,5> myints;
mysequence<double,5> myfloats;
myints.setmember(0,100);
myfloats.setmember(3,3.1416);
cout << myints.getmember(0) << '\n';
cout << myfloats.getmember(3) << '\n';
return 0;
}