2

一部の (すべてではない) クラス テンプレート パラメータに特化することは可能ですか?

例えば:

template <typename T, typename U>
class TC
{
public:
 void Foo();
};

template <typename T, typename U>
void TC<T, U>::Foo()
{

}

template <???, typename U>
void TC<int, U>::Foo()
{
  //Want this defined for all U but only when T is int.
}

int main(int argv, char * args [])
{
 TC<int, char> tc;
 return 0;
}
4

3 に答える 3

3

通常、クラス テンプレートの一部のテンプレート パラメータだけを特殊化できます。これは「部分特殊化」と呼ばれます。これを行う場合、一般的なバージョンを「オーバーライド」する新しい特殊なバージョンのテンプレートを作成します。

あなたの場合、テンプレートの一部であるメソッドのみを特化したいようですFoo()が、これは不可能です。TCクラス全体を特殊化する必要があります。

// specialization for T=int
template <typename U>
class TC<int, U> {
public:
  void Foo();
};

// implementation of Foo() for the specialized template
template <typename U>
void TC<int, U>::Foo()
{
  //Want this defined for all U but only when T is int.
}
于 2010-02-08T07:08:18.247 に答える
1

クラスについては、はい。関数の場合は、いいえとはい。

クラスの部分的なテンプレートの特殊化は問題ありませんが、グローバル関数の場合はもう少し注意が必要です。

クラスの場合、テンプレート パラメーター リストから特殊な引数を省略し、それをクラス定義に含めます。

// General template class for a vector
template <class T, int N>
struct Vector
{
  T e[N];
};

// Specialization for N=3
template <class T> // omit the N
struct Vector<T, 3> // and include it here
{
  T e[3];

  static Vector<T, 3> cross(const Vector<T, 3>& a, const Vector<T, 3>& b)
  {
    return Vector<T, 3>( a.e[1] * b.e[2] - a.e[2] * b.e[1],
                         a.e[2] * b.e[0] - a.e[0] * b.e[2],
                         a.e[0] * b.e[1] - a.e[1] * b.e[0] );

  }
};

グローバル関数の場合、それはできません。完全に一般的な関数または完全に特殊化された関数を定義できます。関数の部分的な特殊化は許可されていません。

ただし、部分的に特化されたクラスの静的関数のプロキシとして関数を作成することにより、関数を部分的に特化することができます。

例えば

template <class A, class B>
void foo(A a, B b)
{
  foo_impl::fun(a, b);
}

template <class A, class B>
struct foo_impl
{
  static void fun(A a, B b)
  {
    // real implementation here
  }
};

その後、好きなように専門化することができ、foo_implそれが に反映されfooます。

于 2010-02-08T10:08:54.737 に答える
0

クラスの一部のみを専門にしたい場合は、フックを提供するために元のクラスが必要です。これは通常、実装として、TraitsまたはPolicies実装に応じて説明されます。

クラスは、特定のタイプのいくつかのプロパティ、場合によってはメソッドを参照するTraitsクラスであり、明示的に渡されません。STLの例はですstd::iterator_traits<It>

Policyクラスは、多くの機能を実装するために使用されるテンプレートパラメータとして渡されるクラスです。STLの例はstd::less<int>にありstd::set<int, std::less<int> >ます。

一般に、Policyクラスの使用は明示的ですが、aの使用Traitsは暗黙的です...したがって、私は後者よりも前者を好みます。

クラスがこれらのフックを使用しない場合は、部分的な特殊化について回答するために報告し、部分的なものは一部のパラメーターがまだテンプレートであることを意味し、クラスの一部を特殊化するだけではないことにsth注意してください。実際、すべてを再定義する必要があります。 。

于 2010-02-08T09:59:20.403 に答える