给出以下课程
class Foo {
struct Bar {
...
};
...
std::deque<Bar> m_bar;
};
我想重用大部分内容并添加新功能,我需要将m_bar
的类型从std::deque
更改为我的deque版本。我想创建Foo<T>
模板化类,其中T
是deque的类型,并从我的deque版本的规范继承:
class MyFoo : Foo<MyDeque> {
...
};
我有两个问题:
编辑:请注意,MyDeque
与std::deque
的模板参数不同。
答案 0 :(得分:3)
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 { … };
答案 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;
}