C++テンプレートの基本
C++のテンプレートは、コードの再利用性を高めるための強力な機能です。テンプレートを使用すると、型に依存しない汎用的なコードを書くことができます。
テンプレート関数
テンプレート関数は、型パラメータを持つ関数です。以下に、テンプレート関数の基本的な定義を示します。
template <typename T>
T max(T a, T b) {
return (a > b) ? a : b;
}
この関数max
は、任意の型T
の2つの引数を取り、大きい方を返します。
テンプレートクラス
テンプレートクラス(またはテンプレート構造体)は、型パラメータを持つクラス(または構造体)です。以下に、テンプレートクラスの基本的な定義を示します。
template <typename T>
class Box {
public:
Box(T val) : val_(val) {}
T get() { return val_; }
private:
T val_;
};
このクラスBox
は、任意の型T
の値を保持し、その値を取得するメソッドを提供します。
以上が、C++テンプレートの基本的な使い方です。テンプレートはC++の中核的な機能であり、効率的な汎用コードを書くためには必須の知識です。
型とテンプレート
C++のテンプレートは、型に依存しない汎用的なコードを書くための強力な機能です。テンプレートは、型をパラメータとして取り、その型に対して動作するコードを生成します。
型推論
C++のテンプレートは、型推論をサポートしています。これにより、テンプレート関数を呼び出す際に、型引数を明示的に指定する必要がなくなります。
int a = 5;
int b = 10;
int max_val = max(a, b); // 型推論により、Tはint型と推論されます
型制約
C++20からは、テンプレートに型制約を追加することができます。これにより、テンプレートが特定の型に対してのみ動作するように制限することができます。
template <typename T>
requires std::is_integral_v<T>
T max(T a, T b) {
return (a > b) ? a : b;
}
この関数max
は、T
が整数型である場合にのみ動作します。
以上が、C++の型とテンプレートについての基本的な説明です。テンプレートは、型に依存しないコードを書くための強力なツールであり、C++のプログラミングにおいて重要な役割を果たしています。
テンプレートの特殊化
C++のテンプレートは、特定の型に対して特別な動作を定義するための特殊化をサポートしています。これにより、一般的なテンプレート定義とは異なる動作を特定の型に対して提供することができます。
関数テンプレートの特殊化
関数テンプレートの特殊化は、特定の型に対して特別な動作を定義します。以下に、関数テンプレートの特殊化の例を示します。
template <typename T>
T max(T a, T b) {
return (a > b) ? a : b;
}
// 特殊化: char型に対するmax関数
template <>
char max(char a, char b) {
// 大文字小文字を無視した比較
return (std::toupper(a) > std::toupper(b)) ? a : b;
}
この例では、char
型に対するmax
関数は大文字小文字を無視した比較を行います。
クラステンプレートの特殊化
クラステンプレートの特殊化も可能で、特定の型に対して特別な動作を定義します。
template <typename T>
class Box {
public:
Box(T val) : val_(val) {}
T get() { return val_; }
private:
T val_;
};
// 特殊化: int型に対するBoxクラス
template <>
class Box<int> {
public:
Box(int val) : val_(val) {}
int get() { return val_ * val_; } // 値の二乗を返す
private:
int val_;
};
この例では、int
型に対するBox
クラスは、get
メソッドで値の二乗を返します。
以上が、C++のテンプレートの特殊化についての基本的な説明です。特殊化は、特定の型に対して特別な動作を提供するための強力なツールであり、C++のプログラミングにおいて重要な役割を果たしています。
変数テンプレート
C++14から導入された変数テンプレートは、型に依存する値を定義するための機能です。これにより、型に対応する値を一般的な方法で定義することができます。
以下に、変数テンプレートの基本的な定義を示します。
template <typename T>
constexpr T pi = T(3.1415926535897932385);
この変数テンプレートpi
は、任意の型T
のπの値を表します。constexpr
キーワードは、pi
がコンパイル時定数であることを示します。
変数テンプレートを使用すると、以下のように型に応じた値を取得することができます。
double d = pi<double>; // double型のπ
float f = pi<float>; // float型のπ
以上が、C++の変数テンプレートについての基本的な説明です。変数テンプレートは、型に対応する値を一般的な方法で定義するための強力なツールであり、C++のプログラミングにおいて重要な役割を果たしています。
エイリアステンプレート
C++11から導入されたエイリアステンプレートは、テンプレート型の別名を定義するための機能です。これにより、複雑なテンプレート型の名前を簡単にすることができます。
以下に、エイリアステンプレートの基本的な定義を示します。
template <typename T>
using Vec = std::vector<T>;
このエイリアステンプレートVec
は、std::vector<T>
の別名として機能します。これにより、以下のように型の名前を簡単にすることができます。
Vec<int> v; // std::vector<int>の別名
以上が、C++のエイリアステンプレートについての基本的な説明です。エイリアステンプレートは、複雑なテンプレート型の名前を簡単にするための強力なツールであり、C++のプログラミングにおいて重要な役割を果たしています。