最終更新日時(UTC):
が更新

履歴 編集

extern template [N1987](C++11)

このページはC++11に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

概要

extern templateは、指定したテンプレートを、その翻訳単位でインスタンス化しないことを指示するための機能である。

これを使用することによって、複数の翻訳単位で同じテンプレートのインスタンス化が行われることを抑制できる。それによって、コンパイル速度が向上すること、およびオブジェクトファイルのサイズが膨れ上がるのを抑える効果が期待できる。

// large_features.h

// インスタンス化すると巨大なサイズになるクラス・関数
template <class T>
class large_class {};

template <class T>
void large_function() {}

// user1.cpp
#include "large_features.h"

void user1()
{
  // large_class<int>とlarge_function<int>()を
  // インスタンス化して使用する
  large_class<int> x;
  large_function<int>();
}

// user2.cpp
#include "large_features.h"

// この翻訳単位では、large_class<int>とlarge_function<int>()を
// インスタンス化しない
extern template class large_class<int>;
extern template large_function<int>();

void user2()
{
  large_class<int> x;
  large_function<int>();
}

このように、同じテンプレート引数を指定するユーザーが複数の翻訳単位にいる場合、ひとつの翻訳単位だけがテンプレートをインスタンス化し、ほかの翻訳単位はextern templateを使用して「テンプレートをインスタンス化しない」と指示することで、テンプレートのインスタンスがひとつで済むようになる。extern templateを指定した翻訳単位では、そのテンプレートをインスタンス化はしないが、参照はできる。

仕様

  • extern templateディレクトティブがひとつの翻訳単位で現れた場合、他のいずれかの翻訳単位、もしくは同じ翻訳単位のextern template指定後に、そのエンティティをインスタンス化しなければならない。そのエンティティがインスタンス化されない場合、プログラムは不適格となる

参照