C++ では、クラスにテンプレート メソッドを含めることができますが、テンプレート データ メンバーを含めることはできません。例えば:
template<typename T, int n>
struct FixedVector {
T x[n];
FixedVector() {
for (int i=0; i<n; i++) x[i] = 0;
}
template<typename C>
void copy(const C& container) {
if (container.size() != n) {
throw std::runtime_error("Wrong size");
}
int j = 0;
for (typename C::const_iterator i=container.begin(),
e=container.end();
i!=e;
++i)
{
x[j++] = *i;
}
}
};
上記のクラスを使用すると、ベクトルやリストなど、 と を持つものを宣言しFixedVector<int, 5> f
て呼び出すことf.copy(v)
ができます。テンプレートメソッドも同様です。つまり、コンパイラは、関数に渡す型ごとに異なるバージョンを生成します。v
size
begin
end
FixedVector::copy
std::vector<double> y;
y.push_back(3.4); y.push_back(5.6); y.push_back(7.8);
std::list<unsigned char> z;
z.push_back('a'); z.push_back('b'); z.push_back('c');
FixedVector<int, 3> v;
v.copy(y); // This is ok
v.copy(z); // This is ok too
C++ はテンプレートデータ メンバーを許可しません。これは、特定のコンパイル ユニットで使用している型の数に応じて異なるクラス サイズを意味し、これは一度に 1 つのユニットの C++ コンパイル モデルと一致しないためです。 .
メソッドの追加は、クラスのサイズに影響しないため問題ありません。また、異なるコンパイル ユニットから同じメソッドの複数のコピーをプルすることを避けることで、リンク時にすべてを修正できます。