「C++の基礎 - テンプレート」の版間の差分

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
(Wiki がページ「テンプレートの使い方」を「C++の基礎 - テンプレート」に、リダイレクトを残さずに移動しました)
(文字列「<source lang」を「<syntaxhighlight lang」に置換)
13行目: 13行目:
以下のソースコードは、様々な型の加算ができる関数である。<br>
以下のソースコードは、様々な型の加算ができる関数である。<br>
この関数の場合、+演算子を使用できない型はコンパイル時にエラーが出力される。<br>
この関数の場合、+演算子を使用できない型はコンパイル時にエラーが出力される。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  template<typename T>
  template<typename T>
  T Add(T a, T b)
  T Add(T a, T b)
34行目: 34行目:
== テンプレートの特殊化 ==
== テンプレートの特殊化 ==
テンプレートには、特定の型だけ異なる処理を行うテンプレートの特殊化の機能がある。<br>
テンプレートには、特定の型だけ異なる処理を行うテンプレートの特殊化の機能がある。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  template <typename T>
  template <typename T>
  T add(T a,T b)
  T add(T a,T b)
58行目: 58行目:
<br>
<br>
===== 関数テンプレート =====
===== 関数テンプレート =====
  <source lang="c++">
  <syntaxhighlight lang="c++">
  template <typename T>
  template <typename T>
  T add(T a, T b)
  T add(T a, T b)
68行目: 68行目:
===== クラステンプレート =====
===== クラステンプレート =====
宣言方法は、下記のようにすると、テンプレート引数に指定した型を持つようになる。<br>
宣言方法は、下記のようにすると、テンプレート引数に指定した型を持つようになる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  CMyClass<int> clsHoge();  // テンプレートクラスのインスタンス生成
  CMyClass<int> clsHoge();  // テンプレートクラスのインスタンス生成
  </source>
  </source>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  template <typename T>
  template <typename T>
  class CMyClass
  class CMyClass
85行目: 85行目:
任意のメンバ関数にだけ関数テンプレートを使用することもできる。<br>
任意のメンバ関数にだけ関数テンプレートを使用することもできる。<br>
定義方法は、関数テンプレートとほぼ同じである。<br>
定義方法は、関数テンプレートとほぼ同じである。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  class CMyClass
  class CMyClass
  {
  {
100行目: 100行目:
C++11から、typedefをusingで記述できるようになった。<br>
C++11から、typedefをusingで記述できるようになった。<br>
以下の2つは同様の意味を持つ。<br>
以下の2つは同様の意味を持つ。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  typedef TypographicError typo;
  typedef TypographicError typo;
  using typo = TypographicError;
  using typo = TypographicError;
107行目: 107行目:
また、usingを用いたエイリアスにはテンプレートを使用することができる。<br>
また、usingを用いたエイリアスにはテンプレートを使用することができる。<br>
このように、型のエイリアスの作成、テンプレート引数の再編成などが行える。<br>
このように、型のエイリアスの作成、テンプレート引数の再編成などが行える。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  UsingTemplate.cpp
  UsingTemplate.cpp
  template<typename T, typename U>
  template<typename T, typename U>

2021年11月15日 (月) 00:30時点における版

概要

C++には多くのデータ型が存在する。
int型やdouble型、char型、std::string型など、自作のデータ型も含めれば無数に存在する。

型というのは不自由なもので、型を決定することで、そのコード自体を不自由にしてしまう可能性がある。

オーバーロード機能を使えば同名で多重定義することも可能であるが、型は無数に存在するので無数に記述しなければならい。
また、オーバーロード機能を使用する場合、開発者はユーザがどのような型を使用するのか予知する必要がある。


関数テンプレート

開発者は、様々な型に対して適応できるコードで記述する必要がある。
以下のソースコードは、様々な型の加算ができる関数である。
この関数の場合、+演算子を使用できない型はコンパイル時にエラーが出力される。

<syntaxhighlight lang="c++">
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;
}
</source>


また、template<class T>と記述することで、Tを任意の型として関数内で使用できる。


テンプレートの特殊化

テンプレートには、特定の型だけ異なる処理を行うテンプレートの特殊化の機能がある。

<syntaxhighlight lang="c++">
template <typename T>
T add(T a,T b)
{
   return a + b;
}

// double型だけ異なる処理を行う
template <>
double add(double a, double b)
{
   return a - b;
}
</source>



関数クラスメンバエイリアステンプレート

以下に示す通り、テンプレートは数種類が存在する。

  • 関数テンプレート
  • クラステンプレート
  • メンバテンプレート
  • エイリアステンプレート


関数テンプレート
<syntaxhighlight lang="c++">
template <typename T>
T add(T a, T b)
{
   return a + b;
}
</source>


クラステンプレート

宣言方法は、下記のようにすると、テンプレート引数に指定した型を持つようになる。

<syntaxhighlight lang="c++">
CMyClass<int> clsHoge();  // テンプレートクラスのインスタンス生成
</source>
<syntaxhighlight lang="c++">
template <typename T>
class CMyClass
{
   public:
      CMyClass() {};
      virtual ~CMyClass() {};
      T value;
};
</source>


メンバテンプレート

任意のメンバ関数にだけ関数テンプレートを使用することもできる。
定義方法は、関数テンプレートとほぼ同じである。

<syntaxhighlight lang="c++">
class CMyClass
{
   public:
      int nanika;

   public:
      template<typename T>
      T Function(T a,T b);
};
</source>


エイリアステンプレート

C++11から、typedefをusingで記述できるようになった。
以下の2つは同様の意味を持つ。

<syntaxhighlight lang="c++">
typedef TypographicError typo;
using typo = TypographicError;
</source>


また、usingを用いたエイリアスにはテンプレートを使用することができる。
このように、型のエイリアスの作成、テンプレート引数の再編成などが行える。

<syntaxhighlight lang="c++">
UsingTemplate.cpp
template<typename T, typename U>
T Add1(T a, U b);

template<typename T>
using Add2 = Add1<T, T>;
</source>