テンプレートで型と演算を指定
昨日の続き。
演算の前後の処理が共通で、対象となるデータの型と演算が違うとき、どうやってコードを短くしてやろうか。型が違うだけなら素直にテンプレートを使えばいいが、演算も違うときにどうするか。
結局、C++のテンプレートは演算子をテンプレート引数に与えることができないので、「演算を抽象化するオブジェクトのクラスのテンプレート」を用意するという方法をとった。
こんな感じ
定義
templateclass binop { // 二項演算の基底クラスのテンプレート public : virtual T operator()(const &T s1, const T& s2) const = 0; }; template class add : public binop { public : virtual T operator()(const &T s1, const T& s2) const { return s1+s2; } }; /* 同様に sub, mul, div, mod などを定義 */ template T arithm(const binop & op, ...) { T src1, src2; /* src1, src2 の前処理とか */ return op(src1, src2); // 実際の演算 };