「C++の基礎 - テンプレート」の版間の差分
ナビゲーションに移動
検索に移動
細 (Wiki がページ「テンプレートの使い方」を「C++の基礎 - テンプレート」に、リダイレクトを残さずに移動しました) |
細 (文字列「<source lang」を「<syntaxhighlight lang」に置換) |
||
| 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) | ||
| 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) | ||
| 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) | ||
| 68行目: | 68行目: | ||
===== クラステンプレート ===== | ===== クラステンプレート ===== | ||
宣言方法は、下記のようにすると、テンプレート引数に指定した型を持つようになる。<br> | 宣言方法は、下記のようにすると、テンプレート引数に指定した型を持つようになる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
CMyClass<int> clsHoge(); // テンプレートクラスのインスタンス生成 | CMyClass<int> clsHoge(); // テンプレートクラスのインスタンス生成 | ||
</source> | </source> | ||
< | <syntaxhighlight lang="c++"> | ||
template <typename T> | template <typename T> | ||
class CMyClass | class CMyClass | ||
| 85行目: | 85行目: | ||
任意のメンバ関数にだけ関数テンプレートを使用することもできる。<br> | 任意のメンバ関数にだけ関数テンプレートを使用することもできる。<br> | ||
定義方法は、関数テンプレートとほぼ同じである。<br> | 定義方法は、関数テンプレートとほぼ同じである。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
class CMyClass | class CMyClass | ||
{ | { | ||
| 100行目: | 100行目: | ||
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; | ||
| 107行目: | 107行目: | ||
また、usingを用いたエイリアスにはテンプレートを使用することができる。<br> | また、usingを用いたエイリアスにはテンプレートを使用することができる。<br> | ||
このように、型のエイリアスの作成、テンプレート引数の再編成などが行える。<br> | このように、型のエイリアスの作成、テンプレート引数の再編成などが行える。<br> | ||
< | <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>