如何通过制作模板参数来更改数据成员的类型?
How change data member's type by making template parameter?
给定以下类
class Foo {
struct Bar {
...
};
...
std::deque<Bar> m_bar;
};
我想重用它的大部分,并添加新的函数,为此我需要将m_bar
的类型从std::deque
更改为我的deque版本。我想制作Foo<T>
模板化的类,其中T
是deque的类型,并从我的deque版本的规范中继承:
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 { … };
为什么不为不合适的容器制作一个适配器呢?下面有一个经过修改的代码:
#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;
}
相关文章:
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- 是否可以根据其数据成员的类型确定类型的大小
- 拒绝包含某些公共静态数据成员的类型
- 复制构造抽象类型的数据成员
- 引用类型的数据成员提供有关恒常正确性"loophole"
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 具有引用数据成员的结构不是文本类型吗?
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 标记为 [数据成员] 时的意外类型'USN'
- 依赖于依赖类型的非静态数据成员的非限定名称
- 基类数据成员类型取决于派生类
- 类型为专用数据成员的静态成员
- QString:包括非文本类型的静态数据成员的初始化
- 由于标准而指向 Base 数据成员的指针类型
- sizeof参考对于类型和数据成员的不同
- 参考类型静态数据成员的问题可能是编译器错误
- 指向不完整类型的数据成员
- 联合类型的数据成员的初始化
- 基于另一个数据成员的类数据成员类型