学習用と評価関数用の特徴を共有したい

short eval()
{
  score+=Σ○○
}
void inc_param(float f)
{
  Σ(○○+=f)
}

ということで○○の部分は同じ処理になる。(実際は更新する配列は別物)
akiさんはブログで、コピーして置換するマクロを使われていると書かれていた。
自分はどっちかを書いて、片方にコピペして修正している。修正点は僅かなので手間は少ない。
でも、同じような関数が複数あるのは精神衛生上悪い。
(ちなみにbona4はmake_listが学習用と評価用に2つある。
評価関数自体がものすごくシンプルなので、もはや共有したいとか思わないレベル)


単純に考えれば

void func(int flag,int& score,float f)
{
  if(flag==1)
  {
    score+=Σ○○
  }
  else
  {
    Σ(○○+=f)
  }
}

でまとめられるが、これはまとめたとは言えないだろう(汗


マクロかtemplateを使って、Σ○○をまとめてみたいのだけど。
左辺値と右辺値の違いになってるのが頭が痛い。

#define func(f) { score+=Σ(○○+=f); }

呼ぶときは、学習時func(f)、評価時func(0)で使い分ける
func(f)で無駄にscoreを計算してもそこまで遅くなることは無いはずで、
評価時はfunc(0)ならおそらく+=0はコンパイラが無かったことにしてくれるはずなので全く遅くならないはず
これだ!これで充分だ!
templateは関数なので呼び出しオーバーヘッドがかかりそうだし
もっとスマートにやる方法は無いだろうか?