「C++の基礎 - テンプレート」の版間の差分
		
		
		
		
		
		ナビゲーションに移動
		検索に移動
		
				
		
 
		
	
細 (Wiki がページ「テンプレートの使い方」を「C++の基礎 - テンプレート」に、リダイレクトを残さずに移動しました)  | 
				細 (文字列「</source>」を「</syntaxhighlight>」に置換)  | 
				||
| (同じ利用者による、間の1版が非表示) | |||
| 13行目: | 13行目: | ||
以下のソースコードは、様々な型の加算ができる関数である。<br>  | 以下のソースコードは、様々な型の加算ができる関数である。<br>  | ||
この関数の場合、+演算子を使用できない型はコンパイル時にエラーが出力される。<br>  | この関数の場合、+演算子を使用できない型はコンパイル時にエラーが出力される。<br>  | ||
  <  |   <syntaxhighlight lang="c++">  | ||
  template<typename T>  |   template<typename T>  | ||
  T Add(T a, T b)  |   T Add(T a, T b)  | ||
| 27行目: | 27行目: | ||
     return a + b;  |      return a + b;  | ||
  }  |   }  | ||
  </  |   </syntaxhighlight>  | ||
<br>  | <br>  | ||
また、template<class T>と記述することで、Tを任意の型として関数内で使用できる。<br>  | また、template<class T>と記述することで、Tを任意の型として関数内で使用できる。<br>  | ||
| 34行目: | 34行目: | ||
== テンプレートの特殊化 ==  | == テンプレートの特殊化 ==  | ||
テンプレートには、特定の型だけ異なる処理を行うテンプレートの特殊化の機能がある。<br>  | テンプレートには、特定の型だけ異なる処理を行うテンプレートの特殊化の機能がある。<br>  | ||
  <  |   <syntaxhighlight lang="c++">  | ||
  template <typename T>  |   template <typename T>  | ||
  T add(T a,T b)  |   T add(T a,T b)  | ||
| 47行目: | 47行目: | ||
     return a - b;  |      return a - b;  | ||
  }  |   }  | ||
  </  |   </syntaxhighlight>  | ||
<br><br>  | <br><br>  | ||
| 58行目: | 58行目: | ||
<br>  | <br>  | ||
===== 関数テンプレート =====  | ===== 関数テンプレート =====  | ||
  <  |   <syntaxhighlight lang="c++">  | ||
  template <typename T>  |   template <typename T>  | ||
  T add(T a, T b)  |   T add(T a, T b)  | ||
| 64行目: | 64行目: | ||
     return a + b;  |      return a + b;  | ||
  }  |   }  | ||
  </  |   </syntaxhighlight>  | ||
<br>  | <br>  | ||
===== クラステンプレート =====  | ===== クラステンプレート =====  | ||
宣言方法は、下記のようにすると、テンプレート引数に指定した型を持つようになる。<br>  | 宣言方法は、下記のようにすると、テンプレート引数に指定した型を持つようになる。<br>  | ||
  <  |   <syntaxhighlight lang="c++">  | ||
  CMyClass<int> clsHoge();  // テンプレートクラスのインスタンス生成  |   CMyClass<int> clsHoge();  // テンプレートクラスのインスタンス生成  | ||
  </  |   </syntaxhighlight>  | ||
  <  |   <syntaxhighlight lang="c++">  | ||
  template <typename T>  |   template <typename T>  | ||
  class CMyClass  |   class CMyClass  | ||
| 80行目: | 80行目: | ||
        T value;  |         T value;  | ||
  };  |   };  | ||
  </  |   </syntaxhighlight>  | ||
<br>  | <br>  | ||
===== メンバテンプレート =====  | ===== メンバテンプレート =====  | ||
任意のメンバ関数にだけ関数テンプレートを使用することもできる。<br>  | 任意のメンバ関数にだけ関数テンプレートを使用することもできる。<br>  | ||
定義方法は、関数テンプレートとほぼ同じである。<br>  | 定義方法は、関数テンプレートとほぼ同じである。<br>  | ||
  <  |   <syntaxhighlight lang="c++">  | ||
  class CMyClass  |   class CMyClass  | ||
  {  |   {  | ||
| 95行目: | 95行目: | ||
        T Function(T a,T b);  |         T Function(T a,T b);  | ||
  };  |   };  | ||
  </  |   </syntaxhighlight>  | ||
<br>  | <br>  | ||
===== エイリアステンプレート =====  | ===== エイリアステンプレート =====  | ||
C++11から、typedefをusingで記述できるようになった。<br>  | C++11から、typedefをusingで記述できるようになった。<br>  | ||
以下の2つは同様の意味を持つ。<br>  | 以下の2つは同様の意味を持つ。<br>  | ||
  <  |   <syntaxhighlight lang="c++">  | ||
  typedef TypographicError typo;  |   typedef TypographicError typo;  | ||
  using typo = TypographicError;  |   using typo = TypographicError;  | ||
  </  |   </syntaxhighlight>  | ||
<br>  | <br>  | ||
また、usingを用いたエイリアスにはテンプレートを使用することができる。<br>  | また、usingを用いたエイリアスにはテンプレートを使用することができる。<br>  | ||
このように、型のエイリアスの作成、テンプレート引数の再編成などが行える。<br>  | このように、型のエイリアスの作成、テンプレート引数の再編成などが行える。<br>  | ||
  <  |   <syntaxhighlight lang="c++">  | ||
  UsingTemplate.cpp  |   UsingTemplate.cpp  | ||
  template<typename T, typename U>  |   template<typename T, typename U>  | ||
| 114行目: | 114行目: | ||
  template<typename T>  |   template<typename T>  | ||
  using Add2 = Add1<T, T>;  |   using Add2 = Add1<T, T>;  | ||
  </  |   </syntaxhighlight>  | ||
<br><br>  | <br><br>  | ||
__FORCETOC__  | __FORCETOC__  | ||
[[カテゴリ:C++]]  | [[カテゴリ:C++]]  | ||
2021年11月24日 (水) 18:07時点における最新版
概要
C++には多くのデータ型が存在する。
int型やdouble型、char型、std::string型など、自作のデータ型も含めれば無数に存在する。
型というのは不自由なもので、型を決定することで、そのコード自体を不自由にしてしまう可能性がある。
オーバーロード機能を使えば同名で多重定義することも可能であるが、型は無数に存在するので無数に記述しなければならい。
また、オーバーロード機能を使用する場合、開発者はユーザがどのような型を使用するのか予知する必要がある。
関数テンプレート
開発者は、様々な型に対して適応できるコードで記述する必要がある。
以下のソースコードは、様々な型の加算ができる関数である。
この関数の場合、+演算子を使用できない型はコンパイル時にエラーが出力される。
 template<typename T>
 T Add(T a, T b)
 {
    return a + b;
 }
 
 // 2つ以上の引数を取ることもできる
 // T = UまたはT ≠ Uであってもこの関数が使用できる
 template<typename T, typename U>
 T Add(T a,U b)
 {
    return a + b;
 }
また、template<class T>と記述することで、Tを任意の型として関数内で使用できる。
テンプレートの特殊化
テンプレートには、特定の型だけ異なる処理を行うテンプレートの特殊化の機能がある。
 template <typename T>
 T add(T a,T b)
 {
    return a + b;
 }
 
 // double型だけ異なる処理を行う
 template <>
 double add(double a, double b)
 {
    return a - b;
 }
関数クラスメンバエイリアステンプレート
以下に示す通り、テンプレートは数種類が存在する。
- 関数テンプレート
 - クラステンプレート
 - メンバテンプレート
 - エイリアステンプレート
 
関数テンプレート
 template <typename T>
 T add(T a, T b)
 {
    return a + b;
 }
クラステンプレート
宣言方法は、下記のようにすると、テンプレート引数に指定した型を持つようになる。
 CMyClass<int> clsHoge();  // テンプレートクラスのインスタンス生成
 template <typename T>
 class CMyClass
 {
    public:
       CMyClass() {};
       virtual ~CMyClass() {};
       T value;
 };
メンバテンプレート
任意のメンバ関数にだけ関数テンプレートを使用することもできる。
定義方法は、関数テンプレートとほぼ同じである。
 class CMyClass
 {
    public:
       int nanika;
 
    public:
       template<typename T>
       T Function(T a,T b);
 };
エイリアステンプレート
C++11から、typedefをusingで記述できるようになった。
以下の2つは同様の意味を持つ。
 typedef TypographicError typo;
 using typo = TypographicError;
また、usingを用いたエイリアスにはテンプレートを使用することができる。
このように、型のエイリアスの作成、テンプレート引数の再編成などが行える。
 UsingTemplate.cpp
 template<typename T, typename U>
 T Add1(T a, U b);
 
 template<typename T>
 using Add2 = Add1<T, T>;