それほど悪くはありません。クラステンプレートのメンバ関数の部分的な特殊化は許されません。
template <typename T,bool B>
struct X
{
void Specialized();
};
// works
template <>
void X<int,true>::Specialized()
{
...
}
周りの仕事はまだ同じクラスであるという利点を持つオーバーロードされた関数を導入することであり、したがって、彼らはメンバ変数に同じアクセス権を持って、機能や
// "maps" a bool value to a struct type
template<bool B> struct i2t { };
template <typename T,bool B>
struct X
{
void Specialized() { SpecializedImpl(i2t<B>()); }
private:
void SpecializedImpl(i2t<true>) {
// ...
}
void SpecializedImpl(i2t<false>) {
// ...
}
};
注意を詰め込みますオーバーロードされた関数に渡し、テンプレートパラメータを関数パラメータにプッシュすることによって、関数を任意に「特殊化」することができ、必要に応じてテンプレート化することもできます。他の一般的な手法は、私は通常より多くのコードを必要とし、私は他の人がクラステンプレートの道に延期を好む機能は、扱いやすい過負荷に見つけることがわかり別途
template<typename T, bool B>
struct SpecializedImpl;
template<typename T>
struct SpecializedImpl<T, true> {
static void call() {
// ...
}
};
template<typename T>
struct SpecializedImpl<T, false> {
static void call() {
// ...
}
};
template <typename T,bool B>
struct X
{
void Specialized() { SpecializedImpl<T, B>::call(); }
};
定義されたクラステンプレートに延期することです。結局それは味の問題です。この場合、他のテンプレートをネストされたテンプレートとしてX
に入れておくこともできます。名前空間のスコープでのみ明示的な特殊化を行うことができるため、部分的にではなく明示的に特殊化し、クラススコープではありません。以下のバリアントがあまりにも最初のパラメータ変数を残す実証として
あなたはまた、単にオーバーロードする関数の目的のために、このようなSpecializedImpl
のテンプレートを作成することができ、(それはその後、前の私たちのi2t
に似ています)(あなたが他とそれを呼び出すことができますタイプ - だけではなく、現在のインスタンスのテンプレートパラメータを持つ)
template <typename T,bool B>
struct X
{
private:
// maps a type and non-type parameter to a struct type
template<typename T, bool B>
struct SpecializedImpl { };
public:
void Specialized() { Specialized(SpecializedImpl<T, B>()); }
private:
template<typename U>
void Specialized(SpecializedImpl<U, true>) {
// ...
}
template<typename U>
void Specialized(SpecializedImpl<U, false>) {
// ...
}
};
私は時々、別のテンプレートに延期すると良いです(それは配列とポインタのような例になると、トリッキーな缶をオーバーロードし、ちょうどクラステンプレートへの転送と思います私にとってはより簡単でした)、時にはテンプレート内でのオーバーロードがより効果的です。あなたがクラスのメンバ変数に触れているかどうかを調べます。
あなたがここで何を意味するかは完全にはっきりしていません。テンプレートパラメータを特定の型の子孫にすることを意味しますか?あなたはJavaでと同様にできますか? –
@Alconテンプレートクラスを専門にするときは、クラス全体に対して* different *実装を提供する必要があります。機能を除いて、専門分野間で共通のコードを共有したいと思うようです。 – AraK
この質問は、「メンバー」ではなく「メンバー機能」と言うべきでしょうか?誰もこれがデータメンバーであるとは思わない。 –