|
|
终于能上网了,
在网上耗了很多时间。
这是最后一贴。
曾经被boost库中的种种功能吸引,
一直都想学一学,
但是都没有什么机会。
最近因为需要,接触了几乎最简单的boost::any这个功能
彻底折服于boost了。
以前写接口时,因为不确定类型就要重载好多函数。
如果增加一种类型还要增加一个重载函数。
用void *传递指针太不安全,而且还要附加一个类型信息。
还有,什么时候释放内存也很麻烦。
用RTTI的运行期类型识别是很安全了,不过因为需要有需函数的类才能使用RTTI.
所以对于基本类型还是没辙。
以前也曾考虑过用模板,不过写完之后乱七八糟的,自己都看不明白。
boost::any就解决了所有问题,我不是做广告阿。
any就是任意类型,可以int,...... 因为是用模版实现,不仅保证了效率,而且支持任何类型数据。
其实any主要就一个相关函数和几个方法。
boost::any a=int(12);
if(a.type()==typeid(int))
cout<<boost::any_cast<int>(a);
a=std::string("sdf")
if(a.type()==typeid(std::string))
cout<<boost::any_cast<std::string>(a);
但是和其他数据结构结合起来,能实现充满想象力的数据结构。
比如
std::map<std::string,boost::any> tree;
这是一个用c++字符串作为键值的树,
因为 boost::any是任何类型,当他值为std::map<std::string,boost::any>时候
就形成一个递归一样的结构,我也说不好什么名次,就好像分型图一样,整个是一个树,每个子节点又是一个一样的树。
关键是这个树可以储存任何类型。
可能你暂时不会想到有什么用途。
但是在我写的程序中,从脚本读出来的数据可能是任何类型的。
Lua脚本语言 只有一种数据结构就是tables
tables又有键值 他的值又是数字,字符串,bool等。
和刚才说明的std::map<std::string,boost::any> tree;类型是可以对应上的。
我从Lua脚本传来的数据储存在tree中,我想象不到什么样的结构能更恰当的储存tables了。 |
|