次のようなクラス階層があります。
class base
{
};
class derived1 : protected base
{
private:
float m_price;
int m_quantity;
float m_value;
public:
// float calculateValue();
};
class derived2 : protected base
{
private:
double m_price;
long m_quantity;
double m_value;
public:
// double calculateValue();
};
ここで、価格と数量を乗算して値を計算する関数を作成する必要があります。その目的は、将来的に新しいクラスを追加することをできるだけ簡単にすることです。お気づきかもしれませんが、これらのフィールドのデータ型はクラスによって異なるため、これは単純ではありません。実際には、概念的には同じことを行うこれらの関数がありますが、プログラミング用語では、これらは異なる操作です。
必要なカット アンド ペーストの量を最小限に抑えるために、これまでに考えられる解決策は、テンプレート関数を使用することです。
template <class A, B, C>
A calculate_value(B price, C quantity)
{
A result;
// Some code to do the multiplication, not sure if template specialisation is needed
return result;
};
class derived1 : protected base
{
private:
float m_price;
int m_quantity;
float m_value;
public:
float calculateValue()
{
calculate_value < float, float, int > (m_price, m_quantity);
}
};
これで問題なく機能しますが、これは、各クラスですべてのメンバー関数を定義する必要があることを意味します。たとえば、getValue という関数が必要な場合は、これらのテンプレート関数がさらにたくさん必要になります。
クラス メンバーのデータ型は、クラスが定義された時点で既知であるため、それらを関数定義に再び配置する必要があるのは重複しているように見えます。関数定義でこのすべてのテンプレート ビジネスを回避する方法はありますか?
ありがとうございました。
アンディ
PS 次の質問を見たことがありますが、その質問の問題は少し異なります: データに応じて異なるデータ型を返す (C++)