c++ - 如何通过创建模板参数来更改数据成员的类型?

标签 c++ templates

给定以下类(class)

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

我想重用其中的大部分内容并添加新函数,我需要更改 m_bar 的类型来自std::deque到我的双端队列版本。我想做Foo<T>模板化类,其中 T是双端队列的类型,继承 self 的双端队列版本的规范:

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

我有两个问题:

  1. 这是个好主意吗?
  2. 如果是这样,您将如何修改 Foo 类的声明来实现这一点?

编辑:请注意 MyDeque没有与 std::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 { … };

关于c++ - 如何通过创建模板参数来更改数据成员的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9878702/

相关文章:

c++ - QAction : No such file or directory

c++ - 从 GLU Tesselator 接收 GLU_TESS_ERROR_5

c++ - C++ 中的继承和模板 : Why doesn't the following piece of code compile?

c++ - 什么是基数*(*)()

c++ - 专用于子项的父可变函数模板

c++ - 函数定义中的函数声明

c++ - 创建 LBP 直方图

c++ - gtkmm x 事件不工作

c++ - 模板表达式如何摆脱临时变量

c++ - 指向模板类方法的指针的 Typedef