如何使用非模板类传递模板对象?
来源:互联网 发布:有关程序员的个性签名 编辑:程序博客网 时间:2024/06/03 20:14
设想一个使用场景:有各种类型对象A,B,C...,这些对象在系统中创建和使用是相分离的,如何搬运这些不同类型的数据对象?好比是购物,不同用户买了不同商品,快递员使用包裹包装这些商品,由卖家将商品打包后,交给快递公司,最后客户收到包裹,拆开包裹后取到商品。
如果这些数据对象没有一个共同的基类,如何将这些对象打包?
可以考虑将类型对象移出包裹类,放在一个其他模板对象中,比如:
完整代码如下:
如果这些数据对象没有一个共同的基类,如何将这些对象打包?
考虑有一个包裹类Wrapper,里面可以存放各种类型的对象,可能写的如下
template<typename T>class Wrapper{public: Wrapper(T* p) : _p(p) {} T* get() const { return _p; }private: T* _p;};使用场景如下:
class CreatorA{public: const Wrapper<A>& getA() { return _d; }private: Wrapper<A> _d;};class UseA{public: void useA(const Wrapper<A>& d) { A* a = d.get(); }};需要传递具体类型,不具有通用性。
可以考虑将类型对象移出包裹类,放在一个其他模板对象中,比如:
template<typename T>class WrapperImp{public: WrapperImp(T* p): _p(p){} T* get() const { return _p; }private: T* _p;};修改Wrapper后:
class Wrapper{public: Wrapper(){} template<typename T> void set(T* p) {}private: WrapperImp<T> m_imp;};写到这里发现,包裹类仍然需要模板类型。再进一步,考虑把imp类提取基类,这样包裹类中只需要保留基类对象指针就可以了。
完整代码如下:
#include <iostream>class WrapperImpBase{public: WrapperImpBase(){} virtual ~WrapperImpBase(){}};template<typename T>class WrapperImp : public WrapperImpBase{public: WrapperImp(T* ptr = 0) :m_ptr(ptr){} T* get() const { return m_ptr; }private: T* m_ptr;};class Wrapper{public: template<typename T> Wrapper(T* ptr) { m_imp = new WrapperImp<T>(ptr); } ~Wrapper() { delete m_imp; } template<typename T> T* get() const { if (m_imp) { WrapperImp<T> * imp = dynamic_cast<WrapperImp<T>*>(m_imp); return imp->get(); } return 0; }private: WrapperImpBase* m_imp;};
阅读全文
0 0
- 如何使用非模板类传递模板对象?
- 非类型模板参数与 非类型类模板参数的使用
- 如何使用servlet模板
- 模板标签之如何传递模板标签参数
- dedecms模板教程:dedecms模板如何使用?
- 模板类如何使用消息映射?
- 如何在模板使用表单类示例
- 非类型模板类参数
- flask模板中使用 jaavscript接收模板传递的值
- 非类型模板参数限制——不可以使用内部链接对象
- 为什么要使用非类型模板参数?
- 如何自定义模板类
- 如何使用smarty模板殷勤
- 什么是类模板 如何定义类模板
- 单例模式 模板类和非模板类实现
- 模板类的非模板友元函数
- 模板类的非约束模板友元函数
- C++语法基础--模板与泛型编程--函数模板,类模板,模板形参,非模板形参
- Linux常用命令-网络通信命令
- 【BZOJ3626】LCA(树链剖分)
- Hello Blog
- 数据库封装
- Down test
- 如何使用非模板类传递模板对象?
- 线程与进程
- mybatis笔记-3-事务
- django学习之路(二)
- centos6.5升级glibc
- libvmi编译问题
- IO流——File类(创建java文件列表)
- AngularJs:router路由与多重视图详解
- Java并发(4)深入分析java线程池框架及实现原理(一)