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能实现很多多态的行为,而这里的多态将会可控。上面是通过接口实现多态,而这里则是通过数据实现多态。同样是多态,还是有那么大的区别。
当然,本文不是强调数据多态,比接口多态好。而是在设计的时候,可以有更多的思维空间,更好的选择。
阅读(782) | 评论(0) | 转发(0) |