Code06
整数と同じようなものを、実数でも実現したいとする。
単純に考えると、整数用と実数用の2つのクラスを作る方法がある。
#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から呼び出す際に定めたクラスとなります。
#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の中で文字列型を使っています。
#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();
}