1

私には5つのクラスがあり、次のように宣言されています。

template <typename T>
class A {
    void fn(X);
};
template <typename T>
class B {};
class C {};
class D {};
class X {};

そして私は2つのインスタンスをそのように宣言しています:

A<B<C>> abc;
A<B<D>> abd;

タイプのオブジェクトとタイプのオブジェクトを使用してfn呼び出す必要があるように、どのようにテンプレート化できますか?abc.fn()Cabd.fn()D

4

2 に答える 2

3

次のように、クラスの部分的な特殊化を行うことができます。

template <typename T> class A;
template <typename T> class B {};

template <typename T>
class A<B<T> > {
  public:
    void fn(T) { }
};

class C {};

class D {};

int main(int,char**)
{
  A<B<C>> abc;
  A<B<D>> abd;
  abc.fn(C());
  abd.fn(D());
  return 0;
}

Bだけでなく、任意のテンプレートで機能させたい場合は、次のようにクラスAを部分的に特殊化できます。

template <typename T,template <typename> class U>
class A<U<T> > {
  public:
    void fn(T) { }
};
于 2013-02-05T06:46:04.150 に答える
2

これはあまりきれいになることはありません。

template <typename T>
class B {public: typedef T type;};

template <typename T>
class A {
    void fn(typename T::type X);
    //void fn(...){}  // would prevent an error if T does not have type.
};

基本的に、typedefに型を保存してから、でそれを使用しAます。Tもちろん、BがのをA持っていない場合、これはエラーになりますT::type

于 2013-02-05T06:03:41.493 に答える