2
4

3 に答える 3

3

translateこれは、次のコードで名前を付けたヘルパーテンプレートを導入することで解決できます。

template<class W>
struct A {
  typedef A type;
};

template<class W>
struct B {
  typedef B type;
};

template<class AB, class U>
struct translate {
};

template<template<typename> class AB, class W, class U>
struct translate<AB<W>, U> {
  typedef AB<U> type;
};

template<class AB>
struct C {
  // AB is A or B. If it's A we want to construct A<double>, if it's B                                                          
  // we want to construct B<double>:                                                                                            
  typedef typename translate<AB, double>::type D;
  D d;
};

int main(int argc, char** argv){
  C<A<int> > c1;
  C<B<int> > c2;
}
于 2012-05-26T02:12:36.080 に答える
3

もう1つのオプションは、アロケータのように実行し、それらにアクセスできる場合は、およびrebindの内部にテンプレートを提供することです。AB

template<class T>
struct A{
  template<class U>
  struct rebind{ typedef A<U> other; };
};

template<class AB>
struct C{
  typedef typename AB::template rebind<double>::other rebound_AB;
};
于 2012-05-26T02:16:36.503 に答える
2

そのためには、部分的なテンプレート仕様が必要です。

// base declaration is undefined
template< typename AorB > struct C;

// declaration for A<W>
template< typename W >
struct C< A< W > >
{
    typedef A< double > type;
};

// declaration for B<W>
template< typename W >
struct C< B< W > >
{
    typedef B< double > type;
};

1つの型引数を持つ任意のテンプレートクラスで機能するより一般的なケースは次のとおりです。

// base declaration is undefined
template< typename AorB > struct C;

// declaration for T<W>
template< template< typename > class T, typename W >
struct C< T< W > >
{
    typedef T< double > type;
};
于 2012-05-26T02:11:16.970 に答える