C++テンプレートの理解と使用

3333 ワード

最近もと学んだものがまったく理解していないことを発见して、だから私はC++を悪补して、自分のC++の中の概念に対する最も简単で乱暴な理解を书いています.
問題点があれば指摘してください~いつでも訂正してください
テンプレート:その名の通り、後で使いやすいように出てくるもので、生活の中のテンプレートは私たちに簡単に真似して自分のものを作ることができて、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   class クラス名

   クラスのメソッドとプロパティ
 };
次に、コードを入力します.
#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