接收Foo <s>后如何构造Foo <t> </s> </t>

时间:2012-05-26 01:33:55

标签: c++ templates

我有一个C的课程A<W>B<W>。现在在C中,我想构建一个A<U>B<U>类型的对象,具体取决于它实例化的内容。

如果这听起来有点奇怪,请考虑此代码及其中的注释:

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

template<class W>
struct B {
  typedef B 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 AB::type type; // A or B                                                                                     
  typename type<double> D; // ERROR
  D d;
};

int main(int argc, char** argv){
  C<A<int> > c1;
  C<B<int> > c2;
}

有没有办法做到这一点?

我认为C需要在嵌套模板上进行模板化,但我不知道该怎么做。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:3)

另一种选择是像分配器一样做,并在rebindA内提供B模板,如果您有权访问这些模板:

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;
};

答案 2 :(得分: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;
};

适用于具有一个类型参数的任何模板类的更一般情况是:

// 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;
};