●学校情報

講座一覧・募集状況

学習方法

学習サポート

修了生の評価

受講生の横顔

当学院について

入学相談

入学手続

 

●講座情報

技術者養成講座

プログラミング講座

WEB講座

情報処理試験講座

Excel講座

Access講座

 

●関連コラム

関連コラム

関連用語集

 

logo

 

 

関連用語集

C++のテンプレート(Template)とは?型に依存しない汎用的な関数・クラスを作ろう!

C++のテンプレート(Template)は、型に依存しない汎用的なプログラムを記述するための機能です。 関数やクラスの処理をひとつのテンプレートとして定義しておけば、int型でもdouble型でもstring型でも再利用が可能になります。

この記事では、C++のテンプレートの基本から使い方、応用までを初心者にもわかりやすく解説します。

テンプレートとは?

テンプレートとは、関数やクラスの「型」を引数として受け取る仕組みです。 つまり、データ型に依存しない共通処理をひとつの定義で使い回せるようになります。

関数テンプレートの基本構文

template <typename T>
戻り値 関数名(引数の型) {
    // 処理
}

typename(またはclass)は、テンプレート引数を示すキーワードです。

関数テンプレートの例

#include <iostream>
using namespace std;

template <typename T>
T maxValue(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    cout << maxValue(3, 7) << endl;         // int型
    cout << maxValue(3.5, 2.1) << endl;     // double型
    cout << maxValue('a', 'z') << endl;     // char型
    return 0;
}

この関数は、どの型でも最大値を求められる汎用関数です。
呼び出し時に自動的に型が推論され、適切な処理が選ばれます。

クラステンプレートの基本構文

template <typename T>
class クラス名 {
private:
    T data;

public:
    クラス名(T value) {
        data = value;
    }

    void show() {
        cout << data << endl;
    }
};

クラステンプレートの例

#include <iostream>
using namespace std;

template <typename T>
class Box {
private:
    T value;

public:
    Box(T v) : value(v) {}

    void display() {
        cout << "中身: " << value << endl;
    }
};

int main() {
    Box<int> intBox(123);
    Box<string> strBox("こんにちは");

    intBox.display();    // 中身: 123
    strBox.display();    // 中身: こんにちは
    return 0;
}

テンプレートのメリット

  1. 汎用性のあるコードが書ける
    型を変えても同じロジックを再利用可能。
  2. 冗長なコードを減らせる
    同じ処理を何度も書かなくてよい。
  3. コンパイル時に展開されるため高速
    テンプレートはマクロとは異なり、型安全です。

注意点

  • テンプレートはエラーメッセージが長くなることがあります。
  • 複雑なテンプレートは可読性が下がるので注意が必要です。
  • 定義と実装はヘッダファイルにまとめるのが一般的です(コンパイルの都合上)。

まとめ

C++のテンプレートは、型に依存しない柔軟で再利用性の高いコードを記述するための強力な機能です。 特に、STL(標準テンプレートライブラリ)もテンプレートで構成されており、C++の中核ともいえる概念です。

まずは簡単な関数テンプレートから始めて、徐々にクラステンプレートやSTLの活用へと発展させていきましょう!

 

C++関連用語集

−−−−−  C++  −−−−−

C++のクラス(Class)とは?仕組みと使い方をわかりやすく解説!

C++のオブジェクト(Object)とは?クラスとの関係と役割をわかりやすく解説!

C++のコンストラクタ(Constructor)とは?役割と使い方をやさしく解説!

C++のデストラクタ(Destructor)とは?役割と使い方をやさしく解説!

C++の継承(Inheritance)とは?クラスを拡張する基本テクニック

C++の多態性/ポリモーフィズム(Polymorphism)とは?オブジェクト指向の真髄を解説!

C++のオーバーロード(Overload)とは?関数や演算子を便利に使い分けよう!

C++のオーバーライド(Override)とは?継承と仮想関数の正しい使い方

C++の仮想関数(Virtual Function)とは?ポリモーフィズムを実現する仕組みを解説!

C++の純粋仮想関数(Pure Virtual Function)とは?抽象クラスとの関係も解説!

C++の抽象クラス(Abstract Class)とは?使い方と役割をわかりやすく解説!

C++のテンプレート(Template)とは?型に依存しない汎用的な関数・クラスを作ろう!

C++の名前空間(Namespace)とは?名前の衝突を防ぐ便利な機能

C++の標準テンプレートライブラリ(STL)とは?効率的な開発に必須のライブラリ群

C++のベクター(vector)とは?配列より便利なSTLコンテナを使いこなそう!

C++のイテレータ(Iterator)とは?STLコンテナを自在に操作する鍵

C++の参照(Reference)とは?ポインタとの違いもわかりやすく解説!

C++のポインタ(Pointer)とは?メモリを操る強力な機能をやさしく解説!

C++の動的メモリ確保(Dynamic Memory Allocation)とは?newとdeleteを使いこなそう

C++のnew/delete演算子とは?動的メモリ確保の基本をマスターしよう!

C++の例外処理(Exception Handling)とは?try/catch/throwでエラーに強いプログラムを作ろう

C++のtry/catch構文とは?例外処理の基本をやさしく解説!

C++のRAIIとは?リソース管理を自動化する重要な設計原則

C++の静的変数(static variable)とは?使い方・特徴・注意点をやさしく解説!

C++の関数ポインタ(Function Pointer)とは?使い方と活用例をわかりやすく解説!

C++のラムダ式(Lambda Expression)とは?書き方・使い方をやさしく解説!

C++のスマートポインタ(Smart Pointer)とは?自動で安全なメモリ管理を実現しよう!

C++のコンパイル(Compile)とは?仕組みと流れをわかりやすく解説!

C++のリンク(Link)とは?コンパイルとの違いとエラー対策を解説!

C++のプリプロセッサディレクティブとは?#include や #define の意味と使い方