如何通过制作模板参数来更改数据成员的类型?

时间:2012-03-26 19:48:47

标签: c++ templates

给出以下课程

class Foo {
    struct Bar {
        ...
    };
    ...
    std::deque<Bar> m_bar;
};

我想重用大部分内容并添加新功能,我需要将m_bar的类型从std::deque更改为我的deque版本。我想创建Foo<T>模板化类,其中T是deque的类型,并从我的deque版本的规范继承:

class MyFoo : Foo<MyDeque> {
    ...
};

我有两个问题:

  1. 这是个好主意吗?
  2. 如果是这样,你会如何修改Foo类的声明以使其成为可能?
  3. 编辑:请注意,MyDequestd::deque的模板参数不同。

2 个答案:

答案 0 :(得分:3)

2)如果MyDequestd::deque具有完全相同的模板签名,则可以将模板名称作为Foo的模板参数传递:

#include <deque>

template <class T, class>
struct MyDeque  {
};

template < 
  template<class T, class Alloc = std::allocator<T> > class Container >
class Foo {
  struct Bar {
    int i;
  };
  Container<Bar> m_bar;
};

int main () {
  Foo<std::deque> m_bar;
  Foo<MyDeque> m_bar2;
}

1)做你要求的事情是完全合理的。特别是,我喜欢这样做,所以我可以轻松指定std::list<>std::vector<>或其他标准容器。

<小时/> 如果您无法使模板签名兼容,并且您具有C ++ 11功能,则可以尝试此模板声明:

template < template <typename ...> class Container >
class Foo { … };

答案 1 :(得分:1)

为什么不为不适合的容器制作适配器?下面有点修改过的代码:

#include <deque>

template <class T>
struct MyDeque  {
};


template <class T>
struct StdDequeAdaptor: public std::deque<T> {};

template <
  template<class T> class Container >
  class Foo {
        struct Bar {
                int i;
                  };
          Container<Bar> m_bar;
  };

int main () {
      Foo<StdDequeAdaptor> m_bar;
        Foo<MyDeque> m_bar2;
}