テンプレートで型と演算を指定

昨日の続き。
演算の前後の処理が共通で、対象となるデータの型と演算が違うとき、どうやってコードを短くしてやろうか。型が違うだけなら素直にテンプレートを使えばいいが、演算も違うときにどうするか。
結局、C++のテンプレートは演算子をテンプレート引数に与えることができないので、「演算を抽象化するオブジェクトのクラスのテンプレート」を用意するという方法をとった。

こんな感じ

定義

template class 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); // 実際の演算
};

使う

arithm(add(), ...);   // intで加算する
arithm(div(), ...); // floatで除算する
arithm(or_(), ...); // floatの論理和はとれないのでエラー

ソースプログラムは小さくて済むけど、オブジェクトプログラムはでかくなるなー。