给定以下类(class)
class Foo {
struct Bar {
...
};
...
std::deque<Bar> m_bar;
};
我想重用其中的大部分内容并添加新函数,我需要更改 m_bar
的类型来自std::deque
到我的双端队列版本。我想做Foo<T>
模板化类,其中 T
是双端队列的类型,继承 self 的双端队列版本的规范:
class MyFoo : Foo<MyDeque> {
...
};
我有两个问题:
- 这是个好主意吗?
- 如果是这样,您将如何修改 Foo 类的声明来实现这一点?
编辑:请注意 MyDeque
没有与 std::deque
相同的模板参数.
最佳答案
2) 如果 MyDeque
和std::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/