読者です 読者をやめる 読者になる 読者になる

YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

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

動機

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

方法

意外にも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はヘッダファイルに書きましょう.