改訂[中編]:OpenFOAM学習者向け C++プログラミング超入門

投稿日時: 2019/01/04 S Nakagawa

Code06

整数と同じようなものを、実数でも実現したいとする。

単純に考えると、整数用と実数用の2つのクラスを作る方法がある。

c++
#include <iostream>

// 整数専用クラス
classextendedInt
{
    intn_;

public:

    intmakeDouble()
    {
        returnn_+n_;
    };

    booldisplayDouble()
    {
        std::cout<<"整数 "<<n_<<" の2倍は "<<makeDouble()<<" です。"<<std::endl; 
        std::cout<<std::endl;
    };

    boolread()
    {
        std::cout<<"整数を入力してください。"<<std::endl;
        std::cin>>n_;
    };
};

// 実数専用クラス
classextendedFloat
{
    floatf_;

public:

    floatmakeDouble()
    {
        returnf_+f_;
    };

    booldisplayDouble()
    {
        std::cout<<"実数 "<<f_<<" の2倍は "<<makeDouble()<<" です。"<<std::endl; 
    };

    boolread()
    {
        std::cout<<"実数を入力してください。"<<std::endl;
        std::cin>>f_;
    };
};

intmain()
{
    extendedIntextInt;
    extInt.read();
    extInt.displayDouble();


    extendedFloatextFlt;
    extFlt.read();
    extFlt.displayDouble();

    return0;
}            

ほとんど同じことを書いたクラスが2つ。内部に持つ型が異なるだけ。まとめられないの?templateを使ってまとめましょう。

Code07

 先ほどの2つのクラスで,int または float だったところを,Type と名前をつけたテンプレートクラスで宣言します。クラスの定義内で,Type となっている部分は,mainから呼び出す際に定めたクラスとなります。

c++
#include <iostream>
#include <string>

template<classType>
classextendedType
{
    Typevalue_;
    std::stringtypeName_;

public:

    extendedType(conststd::string&type)
    {
        typeName_=type;
    }

    TypemakeDouble()
    {
        returnvalue_+value_;
    };

    booldisplayDouble()
    {
        std::cout<<typeName_<<value_<<" の2倍は "<<makeDouble()<<" です。"<<std::endl; 
        std::cout<<std::endl;
    };

    boolread()
    {
        std::cout<<typeName_<<" を入力してください。"<<std::endl;
        std::cin>>value_;
    };
};


intmain()
{
    // template を int としてextendedTypeクラスのインスタンスを生成
    extendedType<int>extInt("整数");

    extInt.read();
    extInt.displayDouble();

    // template を float としてextendedTypeクラスのインスタンスを生成
    extendedType<float>extFlt("実数");

    extFlt.read();
    extFlt.displayDouble();

    return0;
}            

 コンストラクタを作成しました。クラスからオブジェクト(インスタンス)を作る時に、型の名前を渡すようにしました。
 mainでの宣言部分に注意してください。宣言時に、クラス側のtemplateが決定されます。

Code08

これで、色々な型に対応できます。文字列型にも。ただし、演算子+が使える必要があります。

次のコードでは,クラス部分は変更せず,mainの中で文字列型を使っています。

c++
#include <iostream>
#include <string>

template<classType>
classextendedType
{
    Typevalue_;
    std::stringtypeName_;

public:

    extendedType(conststd::string&type)
    {
        typeName_=type;
    }

    TypemakeDouble()
    {
        returnvalue_+value_;
    };

    booldisplayDouble()
    {
        std::cout<<typeName_<<value_<<" の2倍は "<<makeDouble()<<" です。"<<std::endl; 
        std::cout<<std::endl;
    };

    boolread()
    {
        std::cout<<typeName_<<" を入力してください。"<<std::endl;
        std::cin>>value_;
    };
};


intmain()
{
        extendedType<int>extInt("整数");
        extInt.read();
        extInt.displayDouble();
    
        extendedType<float>extFlt("実数");
        extFlt.read();
        extFlt.displayDouble();
    
        extendedType<std::string>extStr("文字列");
        extStr.read();
        extStr.displayDouble();
}