工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C++クラステンプレート完全ガイド:実践的なジェネリックプログラミング

C++クラステンプレート完全ガイド:実践的なジェネリックプログラミング

明確で実践的な例を通じて、C++クラステンプレートを活用して柔軟で型に依存しないコードを書く方法を学びます。

テンプレートはC++におけるジェネリックプログラミングの基盤です。任意のデータ型で動作する再利用可能なコンポーネントを作成でき、コードの明確さを高め、重複を減らします。C++には2種類のテンプレートがあります:関数テンプレートとクラステンプレート。

クラステンプレートを使うと、複数のデータ型に適応する単一のクラスを定義できます。これはコードを短くするだけでなく、保守性も高めます。


クラステンプレートの宣言

クラステンプレートはtemplateキーワードで始まり、その後に角括弧で囲まれたテンプレートパラメータのリストが続き、その後に実際のクラス定義が来ます。

template <class T>
class MyClass {
private:
    T var;
public:
    T getVar() const;
};

ここで、Tはテンプレートのインスタンス化時に指定されるデータ型のプレースホルダーです。キーワードclassはtypenameに置き換えても意味は変わりません。


クラステンプレートのインスタンス化

テンプレートを定義したら、目的の型を指定してオブジェクトを作成できます:

MyClass<int> intObj;
MyClass<float> floatObj;
MyClass<std::string> stringObj;

各インスタンス化は、指定された型に合わせた具象クラスをコンパイル時に生成します。


例1: 汎用数値ラッパー

#include <iostream>
using namespace std;

// 任意の型の単一値を格納するクラステンプレート
template <class T>
class Number {
private:
    T value;
public:
    Number(T v) : value(v) {}
    T getValue() const { return value; }
};

int main() {
    Number<int> intNum(7);
    Number<double> doubleNum(7.7);
    cout << "int Number = " << intNum.getValue() << endl;
    cout << "double Number = " << doubleNum.getValue() << endl;
    return 0;
}

出力

int Number = 7
double Number = 7.7

テンプレートパラメータTがメンバ変数、コンストラクタ引数、戻り値の型に使われており、クラスが任意の型で動作することに注目してください。


クラス外部でのメンバ定義

メンバ関数が大きい場合や特殊化間で共有する場合、クラス本体の外部で定義できます:

template <class T>
class Sample {
public:
    T identity();
};

// クラス外部定義
template <class T>
T Sample<T>::identity() {
    return static_cast<T>(1);
}

クラス外部定義の前にtemplate<class T>宣言が繰り返されることに注意してください。


例2: クラステンプレートを使った電卓

#include <iostream>
using namespace std;

template <class T>
class Calculator {
private:
    T a, b;
public:
    Calculator(T x, T y) : a(x), b(y) {}
    T add() const { return a + b; }
    T subtract() const { return a - b; }
    T multiply() const { return a * b; }
    T divide() const { return a / b; }
    void display() const {
        cout << "a: " << a << ", b: " << b << endl;
        cout << "a + b = " << add() << endl;
        cout << "a - b = " << subtract() << endl;
        cout << "a * b = " << multiply() << endl;
        cout << "a / b = " << divide() << endl;
    }
};

int main() {
    Calculator<int> intCalc(2, 1);
    Calculator<float> floatCalc(2.4f, 1.2f);
    cout << "Int results:\n";
    intCalc.display();
    cout << "\nFloat results:\n";
    floatCalc.display();
    return 0;
}

出力

Int results:
a: 2, b: 1
a + b = 3
a - b = 1
a * b = 2
a / b = 2
Float results:
a: 2.4, b: 1.2
a + b = 3.6
a - b = 1.2
a * b = 2.88
a / b = 2

複数パラメータを持つテンプレート

クラステンプレートは複数のパラメータを受け取れ、デフォルト型も指定できます:

template <class T, class U, class V = int>
class MultiParam {
    T first;
    U second;
    V third;
};

例3: マルチパラメータテンプレート

#include <iostream>
using namespace std;

template <class T, class U, class V = char>
class ClassTemplate {
private:
    T var1;
    U var2;
    V var3;
public:
    ClassTemplate(T v1, U v2, V v3) : var1(v1), var2(v2), var3(v3) {}
    void print() const {
        cout << "var1 = " << var1 << endl;
        cout << "var2 = " << var2 << endl;
        cout << "var3 = " << var3 << endl;
    }
};

int main() {
    ClassTemplate<int, double> obj1(7, 7.7, 'c');
    cout << "obj1 values:\n";
    obj1.print();
    ClassTemplate<double, char, bool> obj2(8.8, 'a', false);
    cout << "\nobj2 values:\n";
    obj2.print();
    return 0;
}

出力

obj1 values:
var1 = 7
var2 = 7.7
var3 = c
obj2 values:
var1 = 8.8
var2 = a
var3 = 0

この例では、第3テンプレートパラメータがデフォルトでcharですが、obj2でboolに上書きできることを示しています。

実践的なアドバイス

C言語

  1. C# static キーワード:静的変数、メソッド、クラスをマスターする
  2. C# 入れ子クラスを理解する:定義、使用法、継承
  3. C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
  4. C++コメント完全ガイド:読みやすく保守しやすいコードのためのベストプラクティス
  5. C++ストレージクラス完全解説:スコープ、ライフタイム、使い方
  6. C++ポリモーフィズム完全理解:仮想関数と純粋仮想関数
  7. C++データ抽象化完全マスター:インターフェースと実装の分離
  8. C++データカプセル化:コードを守る仕組みと実装例
  9. C++インターフェース完全理解:抽象クラスと純粋仮想関数
  10. C++テンプレート完全ガイド:ジェネリックプログラミングの基礎
  11. C#の継承:再利用可能で保守しやすいコードを構築する