テンプレート関数を作成することは可能です。
template<typename T>
void DoSomeThing(T x){}
また、テンプレートクラスを作成することもできます。
template<typename T>
class Object
{
public:
int x;
};
しかし、テンプレート内にないクラスを作成し、そのクラスの関数をテンプレートにすることは可能ですか?すなわち:
//I have no idea if this is right, this is just how I think it would look
class Object
{
public:
template<class T>
void DoX(){}
};
またはクラスはテンプレートの一部ではありませんが、関数はどこですか?
あなたの推測は正しいものです。覚えておく必要があるのは、メンバー関数テンプレートdefinition(宣言に加えて)はcppではなくヘッダーファイルにあることですが、それはnotですクラス宣言自体の本体に含まれている必要があります。
こちらをご覧ください: テンプレート 、 テンプレートメソッド 、メンバーテンプレート、メンバー関数テンプレート
class Vector
{
int array[3];
template <class TVECTOR2>
void eqAdd(TVECTOR2 v2);
};
template <class TVECTOR2>
void Vector::eqAdd(TVECTOR2 a2)
{
for (int i(0); i < 3; ++i) array[i] += a2[i];
}
はい、テンプレートメンバ関数は完全に合法であり、多くの場合に役立ちます。
唯一の注意点は、テンプレートメンバー関数を仮想にすることはできないということです。
最も簡単な方法は、宣言と定義を同じファイルに入れることですが、実行可能なファイルが大きすぎる可能性があります。例えば。
class Foo
{
public:
template <typename T> void some_method(T t) {//...}
}
また、テンプレート定義を個別のファイルに配置する、つまり.cppファイルと.hファイルに配置することもできます。必要なのは、テンプレートのインスタンス化を.cppファイルに明示的に含めることだけです。例えば。
// .h file
class Foo
{
public:
template <typename T> void some_method(T t);
}
// .cpp file
//...
template <typename T> void Foo::some_method(T t)
{//...}
//...
template void Foo::some_method<int>(int);
template void Foo::some_method<double>(double);