目的
extern template
は、別のソースファイルで既に特定のテンプレートの実体化が行われていることをコンパイラに通知します。これによって、ソースコードの膨大化を防ぎ、コンパイル時間を短縮することができます。
通常、テンプレートが使用されると、コンパイラーはそのテンプレートが使用されるすべてのコンパイル・ユニットでそのテンプレートをインスタンス化しますが、これはコードの肥大化とコンパイル時間の増加につながります。 externテンプレートを使うと、そのテンプレートは他のコンパイル・ユニットですでにインスタンス化されているので、現在のコンパイル・ユニットでインスタンス化する必要はない、ということをコンパイラーに伝えます。
例
書き方
extern template class MyTemplate<int>;
MyTemplate.hppで宣言する。
// MyTemplate.hpp
#pragma once
template<typename T>
class MyTemplate {
public:
MyTemplate(const T& value) : value_(value) {}
void print() const { std::cout << "Value: " << value_ << std::endl; }
private:
T value_;
};
もう一つソースファイル(Instantiation.cpp)に、MyTemplate<int>
を実体化しました。
// Instantiation.cpp
#include "MyTemplate.hpp"
template class MyTemplate<int>;
Usage.cppで実体化せずMyTemplate<int>
使用する
// Usage.cpp
#include "MyTemplate.hpp"
extern template class MyTemplate<int>; // 既に実体化したをコンパイラに通知する
int main() {
MyTemplate<int> obj(42);
obj.print();
return 0;
}