C++テンプレートの理解と使用
3333 ワード
最近もと学んだものがまったく理解していないことを発见して、だから私はC++を悪补して、自分のC++の中の概念に対する最も简単で乱暴な理解を书いています.
問題点があれば指摘してください~いつでも訂正してください
テンプレート:その名の通り、後で使いやすいように出てくるもので、生活の中のテンプレートは私たちに簡単に真似して自分のものを作ることができて、C++の中のテンプレートも似ています.
テンプレートを一言で理解し、タイプをパラメータ化し、プログラマにタイプに関係のないコードを記述させる.
どの言語変数にもタイプがあることを知っています.C/C++/Javaは、いわゆるオブジェクトベースの言語JavaScript(varがすべての変数を宣言する)とLua(localがいくつかの変数を宣言する)を含めて、本質的に整形、文字列などに分けられています.
私たちは1つの関数を書く時、往々にして異なるタイプのパラメータを伝達しなければならないが、CあるいはC++のような言語では、私たちは一般的に1つのタイプのパラメータしか伝達できない.例えば、簡単な比較サイズの機能関数である.
このように、テンプレートは运に応じて生まれて、あなたはタイプをパラメータ化することができて、机能のロジックは书いた后に、どんなタイプに比べてすべてできて、とても便利ではありませんか~(ただし、どんな場合でもそう書くことはできません.符号化者がchar文字を比較することを望んでいない場合があります.この場合、intタイプだけを書くとエラーの範囲を制限することができます.そうしないと、後で発見しにくいエラーの結果が発生する可能性があります.このような場合、コンパイル時に問題がないためです.)
では、最初のテンプレートである関数テンプレートについて説明します.フォーマットは次のとおりです.
template 戻りタイプ関数名(パラメータリスト)
{
かんすうたい
ここの
classキーワードは
typenameに取って代わる(両者はしばらく区別がないと考えることができる)
次は直接コードをつけます:min関数テンプレートは任意の2つのタイプの変数を比較することができます.
注意:同じテンプレートタイプのパラメータに2つの異なるタイプを指定することはできません.上記の例ではmin(a,b 1)と書くことはできません.
intとdoubleの比較を実現したい場合は、このように書くことができます.
初心者へのヒント:本物のプロジェクトではよく知らない名前が出てきます.例えば
では、2つ目のテンプレートであるクラステンプレートを紹介します.フォーマットは次のとおりです.
template class クラス名
{
クラスのメソッドとプロパティ
};
次に、コードを入力します.
私たちが使っているSTLではよくこのような声明を見ます.Vector num;今度は理解すべきです.stlの中の容器はすべてクラステンプレートで、ソースコードを調べてみると、その原理を理解できることがわかります.
ここでもう一つヒントを贴ります:摘自寻思.徹のブログ
templateT g(T a,T b){}について.クラスオブジェクトが:A aであることを宣言すると、文呼び出しa.g(2,3.2)はコンパイル時にエラーは発生しませんが、クラスオブジェクトを宣言するときに警告があります.
Tをintタイプに変換し、2番目の実パラメータ3.2はテンプレートパラメータをdoubleに指定し、実行時に3.2を強制タイプ3に変換します.
クラスのオブジェクトが:A aであることを宣言すると、intからdoubleへの自動タイプ変換であるため、上記の警告はありません.これは関数テンプレートとは異なる点です.
テンプレートの中の形参(このカッコの中のもの):タイプの形参、非タイプの形参、テンプレートの形参の3種類があります.
上記の例はすべてタイプパラメータであり、すなわち<>にclassまたはtypenameで宣言されている.
さらに勉強した後、他の2つの状況の理解を分かち合います~
転載先:https://www.cnblogs.com/soft4/p/5078738.html
問題点があれば指摘してください~いつでも訂正してください
テンプレート:その名の通り、後で使いやすいように出てくるもので、生活の中のテンプレートは私たちに簡単に真似して自分のものを作ることができて、C++の中のテンプレートも似ています.
テンプレートを一言で理解し、タイプをパラメータ化し、プログラマにタイプに関係のないコードを記述させる.
どの言語変数にもタイプがあることを知っています.C/C++/Javaは、いわゆるオブジェクトベースの言語JavaScript(varがすべての変数を宣言する)とLua(localがいくつかの変数を宣言する)を含めて、本質的に整形、文字列などに分けられています.
私たちは1つの関数を書く時、往々にして異なるタイプのパラメータを伝達しなければならないが、CあるいはC++のような言語では、私たちは一般的に1つのタイプのパラメータしか伝達できない.例えば、簡単な比較サイズの機能関数である.
int Max(int num1,int num2)
{
return a>b?a:b;
}
このような関数は整数変数しか比較できないことは明らかであり、float、doubleなどを比較するにはほぼ同じコード(論理が完全に同じ)を書き直す必要があるため、コード冗長性が重複する.このように、テンプレートは运に応じて生まれて、あなたはタイプをパラメータ化することができて、机能のロジックは书いた后に、どんなタイプに比べてすべてできて、とても便利ではありませんか~(ただし、どんな場合でもそう書くことはできません.符号化者がchar文字を比較することを望んでいない場合があります.この場合、intタイプだけを書くとエラーの範囲を制限することができます.そうしないと、後で発見しにくいエラーの結果が発生する可能性があります.このような場合、コンパイル時に問題がないためです.)
では、最初のテンプレートである関数テンプレートについて説明します.フォーマットは次のとおりです.
template
{
かんすうたい
ここの
classキーワードは
typenameに取って代わる(両者はしばらく区別がないと考えることができる)
次は直接コードをつけます:min関数テンプレートは任意の2つのタイプの変数を比較することができます.
#include
Using namespace std;
template T min(T a,T b)
{
Return a a1=1.0;
double b1=3.09;
cout<
ここのTは変化可能なタイプで、intタイプを比較したい場合は、上のテンプレートのすべてのTをintに変更すればいいです.注意:同じテンプレートタイプのパラメータに2つの異なるタイプを指定することはできません.上記の例ではmin(a,b 1)と書くことはできません.
intとdoubleの比較を実現したい場合は、このように書くことができます.
template T min(T a,M b)
{
Return a
それからT=int,M=doubleでいいです.<>では、あなたが望むタイプ(理論的に)を無数に定義し、後で普通のタイプのように引用することができます.初心者へのヒント:本物のプロジェクトではよく知らない名前が出てきます.例えば
template _T_ptr min(_T_ptr a,_M_ptr b)
{
Return a
菜鸟にとってはすごいようですが、基本的な文法と构造を身につけるのは问题ではありません.辛抱強く见てください)では、2つ目のテンプレートであるクラステンプレートを紹介します.フォーマットは次のとおりです.
template
{
クラスのメソッドとプロパティ
};
次に、コードを入力します.
#inlcude
template class Modle
{ private:
T value;// T
public:
Modle(T t)
{
Value=t;
}
Void setValue(T v)
{
Value=v;
}
T getValue()
{
Return value;
}
}
template //
void myClass::show()
{
cout< a(5), b(10); // , <> cout<
私たちが使っているSTLではよくこのような声明を見ます.Vector num;今度は理解すべきです.stlの中の容器はすべてクラステンプレートで、ソースコードを調べてみると、その原理を理解できることがわかります.
ここでもう一つヒントを贴ります:摘自寻思.徹のブログ
templateT g(T a,T b){}について.クラスオブジェクトが:A aであることを宣言すると、文呼び出しa.g(2,3.2)はコンパイル時にエラーは発生しませんが、クラスオブジェクトを宣言するときに警告があります.
Tをintタイプに変換し、2番目の実パラメータ3.2はテンプレートパラメータをdoubleに指定し、実行時に3.2を強制タイプ3に変換します.
クラスのオブジェクトが:A aであることを宣言すると、intからdoubleへの自動タイプ変換であるため、上記の警告はありません.これは関数テンプレートとは異なる点です.
テンプレートの中の形参(このカッコの中のもの):タイプの形参、非タイプの形参、テンプレートの形参の3種類があります.
上記の例はすべてタイプパラメータであり、すなわち<>にclassまたはtypenameで宣言されている.
さらに勉強した後、他の2つの状況の理解を分かち合います~
転載先:https://www.cnblogs.com/soft4/p/5078738.html