より正しいテンプレート使用時の分割コンパイルの方法

一ヶ月ほど前にid:yukichankoからテンプレート関連の質問を受けて、
http://d.hatena.ne.jp/yukichanko/20100306/1267825917
とりあえず自分の知っている内容から

という方針でお答えしたんだけど、

  • 使いもしないダミー関数分のメモリ消費
  • 最適化抑制のためのattribute指定による無駄な処理系依存

という、C++の哲学に反しまくった解で少しすっきりしてなかった。で、昨日ふとあるソースを見ていたら、「あ」なんだもっと簡単に出来るんだ。なんという勉強不足、と落ち込んだりした。ので、ごめんなさい込みで正しい解など。

いきなり解

というか単純に下のように書くだけ。

template int square<int>(int);
template float square<float>(float);

こうやって指定するだけで、特殊化というか関数インスタンスが生成される。余分なダミー関数なんて生成されないし、そもそも環境依存しない。あーーー、なんというか自己嫌悪。
冗長だな、と思うなら

#define IMP(f, T) \
    template T f<T>(T)

IMP(square, int);
IMP(square, float);

とかしておけばぐーかな。

結論

勉強不足反省