YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

テンプレートをヘッダファイル外で定義する

動機

普通テンプレートはマクロと似たような扱いを受けるので,通常はヘッダファイルに書くことになる.しかし,見た目は関数なのにヘッダファイルに書くというのがどうも気持ちが悪くてソースファイルに書くことができないのかなと思ったのがきっかけ.

方法

意外にもWikipediaに情報が載っていた.exportというキーワードを使ってテンプレートをソースファイルに書くことができるようである.つまり

  • test.h
template <typename T> void func(std::vector<T>& container, T obj>
  • test.cpp
export template <typename T> void func(std::vector<T>& container, T obj>
{
    container.push_back(obj);
}

くそみたいな例ですみません.ただしexportをサポートしているコンパイラは少なく実際にGCCでは使えません.実際に使ってみると,

warning: keyword `export' not implemented, and will be ignored

と警告が出て実際には実装の部分は無視されます.

感想

やっぱりtemplateは見た目が実装だから,なんとなくソースファイルに書いておきたい気持ちが収まらない.けどまあ,別にtemplateと分かっていたら始めからヘッダファイルを見るだろうし,気持ちの問題な気がするなぁ.inlineってキーワードがあるんだからexportをサポートしてもいいと思うんだけど.

まとめ

templateはヘッダファイルに書きましょう.