より正しいテンプレート使用時の分割コンパイルの方法
一ヶ月ほど前に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);
とかしておけばぐーかな。
結論
勉強不足反省