Chinaunix首页 | 论坛 | 博客
  • 博客访问: 75051
  • 博文数量: 17
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-08 20:19
文章分类

全部博文(17)

文章存档

2008年(17)

我的朋友

分类: C/C++

2008-03-26 18:10:08

boost库中的any类使用非常简单,如下:
boost::any a = 5;
boost::any b = "string";
int a1 = boost::any_cast(a);
std::string b1 = boost::any_cast(b);
当然,结果是:a1 = 5, b1 = "string";
 
any可以是任意类型(还用说,从名称就知道)。void指针也有这样的功能,但是void指针非常危险。比如:
int i = 5;
void* c = &i;
int* p = (int*)c;
这段代码没有经过测试,应该可行。但是如果进行这样的转换呢? std::string* p = (std::string*)c。
此时,将会产生不可预知的问题了。
但是,如果std::string b1 = boost::any_cast(a);这个时候,any会抛出异常。因此,boost::any是类型安全的。
 
如果此时你觉得boost::any很了不起的话,那么,我告诉你,更妙的还在后面。为了实现多态,我们可以这样,
 
class A
{
   virtual void do() = 0;
}
 
class B : public A
{
   virtual void do() {;}
}
 
class c : public A
{
   virtual void do() {;}
}
通过接口,来保证架构代码不变,而功能改变。但是这会带来一个问题,当派生持续,功能繁多的时候,将会对程序产生不可预知的影响。这也是C#中引入sealed的原因。
那么,使用boost::any会带来什么好处呢?
 
class A
{
   virtual void do() = 0;
   boost::any m_data;
}
boost::any 的引入,使A能实现很多多态的行为,而这里的多态将会可控。上面是通过接口实现多态,而这里则是通过数据实现多态。同样是多态,还是有那么大的区别。
当然,本文不是强调数据多态,比接口多态好。而是在设计的时候,可以有更多的思维空间,更好的选择。
 
 
 
 
 
阅读(762) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~