博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Boost_Any初步分析
阅读量:5020 次
发布时间:2019-06-12

本文共 1433 字,大约阅读时间需要 4 分钟。

需求:

解决方案:

理论:

boost中的any是在理论上可以存储任何类型一个类,它的特点之一就利用了虚函数与模板。

c++中的多态可以在运行时确定真正在执行的方法。如下面的例子:

可以先创建一个基类:

class any{    virtual bool doClick() = 0;}

里面有一个纯虚函数,而我们创建其子类,如

class int_any : public any{  bool doClick(){    return false;  }
int mValue;}class float_any: public any { bool doClick(){
return false;}
float mValue;}

这样,在程序内就可以对 int_any或 float_any 使用指针进行统一的指向,如:

std::vector
m_Var;any * p_a = new int_any();any *p_float = new int_any();
m_Var.push_back(p_a);
 
// 使用时,我们要可以通过
for(
int i =
0;i<m_Var.size();++
i) { m_Var.at(i),doClick() }

但这样有一个缺点,就是向用户暴露了两个子类,而实际中我们并不想暴露这两个子类。因为,如果我们要保存一个int类型的类,要手动的创建一个int_any的类,而如果想创建一个float_any的类的话,要创建一个float_any的类。而我们的目标是使用一个类,可以在输入两个不同的类型,可以表示成一个统一的类型。

现在我们可以换一种别的方法:使用模板

我们可以定义这样一个类

template
class holder{ private: T * m_Value; holder(T *p):m_Value(p){}}

这样就可以使用holder<A> 来表示A类,用  holder<B> 来表示B类,这样在实际的代码中,我们使用

holder
Aholder
B
表示两个类,但是由于这两个类在编译时不会认为是相同的类型,也没有一个类型来指代表示这两个类(holder类可不行,要带上类型),再进一步的考虑,我们可以使用
template
class holder :public any{ private: T * m_Value; holder(T *p):m_Value(p){} bool doClick(){
return false;}}

类,来统一表示所有的模板类。这样我们可以认为下面的代码

any *p_A = new holder();any *p_B = new holder();

在编译时认为any *是同一个类型了,std::vector<any *>:: push_back()对数据进行访问

 

其实,这里代码只是将any声明成一个基类,对于其所有的子类,只使用一个模板的类就可以了达到效果了

转载于:https://www.cnblogs.com/K-R-Q/archive/2012/12/17/2822322.html

你可能感兴趣的文章
响应者链
查看>>
指针从函数内部带回返回值
查看>>
在使用webView播放flash或视频文件时无法关闭声音的问题
查看>>
redhat 7 源码安装 mysql5.5.49
查看>>
CCP浅谈
查看>>
NAT虚拟网络配置
查看>>
c#部分---需要实例化的内容;
查看>>
销售类
查看>>
技术项目,问题
查看>>
线程池总结
查看>>
Learning to rank (software, datasets)
查看>>
git常见问题
查看>>
.NETFramework:template
查看>>
HM16.0之帧内模式——xCheckRDCostIntra()函数
查看>>
Jmeter性能测试 入门
查看>>
安卓动画有哪几种?他们的区别?
查看>>
Nodejs学习总结 -Express入门(一)
查看>>
web前端优化
查看>>
ssh 连接原理及ssh-keygen
查看>>
vs2013编译qt程序后中文出现乱码
查看>>