見出し画像

【C++勉強日記】テンプレート

こんにちは。
C++の勉強のため記録を書いています。
今読んでいる書籍がこちらです。

初学者には優しくて色々書きすぎていないちょうど良いレベルの参考書です。

関数テンプレート

全く同じ処理ですが関数に引き渡したときのデータの型が違うという場合というのがありますよね。
そんな時は以下のように別々に関数を用意する必要があります。

例えば、
●整数の足し算をしたい場合
●文字列の足し算をしたい場合

#include <iostream>
#include <string>

using namespace std;

int add(int n1, int n2)
{
    return n1 + n2;
}

string add(string s1, string s2)
{
    return s1 + s2;
}

int main()
{
    cout << add(25, 30) << endl;
    cout << add("Hello", "World") << endl;

    return 0;
}

add()という関数を2つ作って「引数のデータの型」と「返り値のデータの型」が異なる別の関数を2つ作る必要があります。

面倒なので以下のよう関数テンプレートを使ってデータの型を引き渡すことができます。

#include <iostream>
#include <string>

using namespace std;

template <typename T>
T add(T n1, T n2)
{
    return n1 + n2;
}

int main()
{
    cout << add<int>(25, 30) << endl;
    cout << add<double>(25.0, 30.5) << endl;
    cout << add<string>("Hello", "World") << endl;

    return 0;
}

ポイントは以下の2つですね。

関数テンプレートのイメージとしては add<int>(25, 30)とすることで以下のように関数に引き渡されたデータの型が変わります。

クラステンプレート

クラス内でテンプレートが使用された場合もやってみます。
以下の2つのファイルを用意します。
calc.h:クラスの定義
main.cpp:メインファイル

calc.h

#ifndef _CALC_H
#define _CALC_H

template<typename T>
class Calc
{
private:
    T m_n1;
    T m_n2;
public:
    inline void set(const T n1, const T n2)
    {
        m_n1 = n1;
        m_n2 = n2;
    };
    inline T add() const{
        return m_n1 + m_n2;
    }
};

#endif

main.cpp

#include <iostream>
#include <string>
#include "calc.h"

using namespace std;

int main()
{
    Calc<int> i1;
    Calc<string> s1;
    i1.set(25, 32);
    s1.set("Hello", "World");
    
    cout << i1.add() << endl;
    cout << s1.add() << endl;   

    return 0;
}

inline関数を使ってクラス内に関数を定義しましたが、クラス内に関数を定義した場合自動的にinline関数になるようですが、ここでは明示的にinline関数の記述を行いました。

2重インクルード防止

2重インクルード防止のためにcalc.hに、

#ifndef _CALC_H
#define _CALC_H

・・・
#endif

という記述を行いましたが、これは例えばmain.cppでcalc.hをインクルードして、別のファイルでもcalc.hをインクルードして・・・・また別のふぁいるでもcalc.hをインクルードしてとなると、何回もcalc.hの中身をインクルードしていることになり重複してしまいます。
なので、
●#ifndef _CALC_Hが定義されているかを確認
●#define~#endifまでの記述を1回だけしかインクルードしないようにコンパラに指令を与える役割があります。

こんな調子でC++の勉強を進めていきます。

Twitter➡@t_kun_kamakiri
Instagram➡kamakiri1225
youtube➡https://www.youtube.com/channel/UCbG6_Q9ZRqqVT6YZOpcjDlQ
ブログ➡宇宙に入ったカマキリ(物理ブログ)
ココナラ➡物理の質問サポートサービス
コミュニティ➡製造業ブロガー

この記事が気に入ったらサポートをしてみませんか?