游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5667|回复: 4

懂boost的人看看这个数据结构,评价一下(用来储存任意类

[复制链接]

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2009-8-25 14:59:00 | 显示全部楼层 |阅读模式
懂boost的人看看这个数据结构,评价一下
用来储存任意类型数据。后面带着两个接口,目的是结合使用variant和any的优点




  1.         typedef boost::variant<char, unsigned char, short, unsigned short, int, unsigned int, long,
  2. unsigned long, int64, uint64, float, double, void * , bool, std::pair<int, int>,
  3. std::pair<float, float>, Any> Variant;
  4.        
  5.        
  6.         template<class T1, class T2 = boost::mpl::find< Variant::types, T1>::type>
  7.         class VariantData
  8.         {
  9.         public:
  10.                 static Variant set(const T1 & in)
  11.                 {
  12.                         return Variant(in);
  13.                 }

  14.                 static T1 get(const Variant & data)
  15.                 {
  16.                         return boost::get< T1 >(data);
  17.                 }

  18.         };

  19.         template<class T1>
  20.         class VariantData<T1, boost::mpl::end<Variant::types>::type>
  21.         {
  22.         public:
  23.        

  24.                 static Variant set(const T1 & in)
  25.                 {
  26.                         return Variant(Any(in));
  27.                 }
  28.                 static T1 get(const Variant & data)
  29.                 {
  30.                         return boost::any_cast<T1>(boost::get< Any >(data));
  31.                 }
  32.         };

复制代码


有什么问题 帮忙批评

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
 楼主| 发表于 2009-8-25 15:05:00 | 显示全部楼层

Re:懂boost的人看看这个数据结构,评价一下(用来储存任意

使用方法是

int a, b = 1;
Variant var = VariantData<int>::set(b);
a = VariantData<int>::get(var);

assert(a = b);

特点
统一接口
任意类型
对于简单类型 使用boost::variant
对于其他任意复杂复杂类型 使用boost::any (以及boost::variant)

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2009-10-6 12:50:00 | 显示全部楼层

Re:懂boost的人看看这个数据结构,评价一下(用来储存任意

重量级人物,打工仔老兄的帖怎能没人顶呢。
看来是曲高和寡呀。那我和说说boost::any的一个实际应用吧。
-----------------------------------------------------------------------------
现在假设在3D场景中有一个简单的圆球结点,sphereNode.
球结点当然会有很多属性,比如说,半径,颜色,position,纹理等。如果我们要对这些属性进行保存和设置,我们可以用setRadius(),setColor(),setPosition()等函数来处理。但是随着属性越来越多,这些函数也会不段增加。

现在我们来定义一个这样的结构体:
struct  WAttribute
        {
        public:
                WAttribute(const tstring &name,const boost::any &value,const tstring &descrip = _T("")):mName(name),mValue(value)
                {
                        mDescription = _T("( ") + name + _T(" )") + descrip;
                };
                WAttribute(){mName = _T("");};

                tstring mName;
                boost::any mValue;
                tstring mDescription;//Give some words for this attribute;
        };
=====================================================
这是一个带有名字和boost::any的属性结构体,有了这样一个结构体,我们就可以在球结点中用一个列表来保存所有属性,如:typedef map<tstring,WAttribute > WAttributeList;
然后一个函数就可以实现对各种属性进行设置了:
bool setAttribute(const tstring &attrName,const boost::any &value);
boost::any能接受任何类型的数值,包括你自定义的类,如:setAttribute("color",WColor(0,0,0,1));
so simple!
=======================================================
如果单单是为了实现一个setAttribute()函数,我们看不出boost::any的强大,但是,如果我们结合脚本或命令行的运用,那我们可以实现一些非常有意思的应用,就像MAYA的脚本窗口,我们可以通过打入这样一行字符串,来实现对sphere结点的属性设置:
setAttr sphere.radius 0.5
setAttr sphere.color 0.3,0.4,0.5,1.0
======================================================
so perfect!Just I like it.

3

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2009-10-7 14:48:00 | 显示全部楼层

Re:懂boost的人看看这个数据结构,评价一下(用来储存任意

如果仅是LS的例子(有关SET/GET),建议看看云风的BLOG,他有提到这方面的问题.
其实template,主要的还是类型约束,如果抛开这个,那不及void*的,万分之一了.
当然还有其它方面的一些优点,但主要是在设计上面吧.

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2009-10-21 16:28:00 | 显示全部楼层

Re:懂boost的人看看这个数据结构,评价一下(用来储存任意

我觉得any就差不多了。。。话说boost还是少用,编译时间太长太长了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-20 04:26

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表