ゆとりーなの日記

日記的な事を書いて行くと思はれる

忘れ去られたというか

忘れ去られたどころか将来消される運命にあるらしい予約語がありました。

exportは忘れられた子

exportは簡単にいうとテンプレートの宣言と実装を分離できるようになる予約語です。

// hoge.h
template <typename T>
void hoge(T t);

// hoge.cc
template <typename T>
void hoge(T t) {
  // 実装
}

// main.cc
#include "hoge.h"

int main() {
  int a;
  hoge(a);
  return 0;
}

ヘッダに実装を書きたくなくなるのはCプラーの人情であると思うのですが、上のコードではリンクエラーが起こります。hogeが実体化していないからです。hoge.cppの最後に

template void hoge<int>;

と書いといてやるとint型のやつは実体化してくれるので使えるようになりますが、他の型では使えずなんだかtemplateの恩恵を受けた気になれません。
そこでexportの出番です。

// hoge.cc
export template <typename T>
void hoge(T t) {
  // 実装
}

これで全てが解決するんです。
しかしこの予約語、私の把握している限りでは実装している処理系は二つしかありません。私がメインで使っているVC++では次のような感じのメッセージがでます。

exportは将来のために予約されています。

将来実装されることはあるのでしょうか。寧ろ標準委員会的には廃止の方向で進んでいるみたいですし。C++ exportでググってもDLL関連のエクスポートとか微妙に関係ないのばっかり出てきます。
個人的にはexport使いたいです。