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

How change data member's type by making template parameter?

本文关键字:数据成员 类型 参数 何通过      更新时间:2023-10-16

给定以下类

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类的声明以使其成为可能

编辑:请注意,MyDequestd::deque的模板参数不同。

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

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

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