一致的模板类型

时间:2011-11-19 06:29:52

标签: c++ templates

问题

考虑以下课程

template <typename T>
struct A
{
   T x;
};

现在,另一个类是模仿的:

template <typename T, typename U>
class B
{
   protected:
      std::vector<U> arr;

   public:
      T get_x(unsigned int p) { return arr[p].x; }
};

我想从A<T>::x内访问字段B<T, A<T>>::get_x()并将其保持不变(即保持其类型为T)。我对模板的了解不足说,这需要知道T的类型和class B应该是B<int, A<double>>的模板参数之一。但是,这使得可以声明一些不一致的内容,例如T,并且通常听起来像是不必要的重复。

问题

  1. 我写的是一个糟糕的编程实践的例子吗?怎么写呢?
  2. 是否有可能推断A<T>::x的类型{{1}}并避免使用两种模板类型?这感觉就像是重复,所以我不确定是否有一个敬畏上帝,标准持久的解决方案。
  3. 对于它的价值,我使用GCC 4.6.2和-std = c ++ 0x。

1 个答案:

答案 0 :(得分:4)

我建议采用标准库采用的方法。定义嵌套类型。

template <typename T>
struct A
{
   typedef T value_type; //this is nested type to be used by B
   T x;
};

//this is another class added by me, just to demonstrate the genericity
template <typename T>
struct C
{
   typedef T value_type; //this is nested type to be used by B
   T x;
};

template <typename T>
class B
{
      typedef typename T::value_type value_type;  //get the nested type
   protected:
      std::vector<T> arr;

   public:
      value_type get_x(unsigned int p) { return arr[p].x; }
    //^^^^^^^^^ note this
};

用法:

 B<A<int>> ba;    //'>>' if C++11, otherwise use '> >' (separate them by space)
 B<C<double>> bc; //works for C class template as well