slice的c++映射

原创 2012年03月21日 19:22:05

1、Slice标识符映射到相同的C++标识符。(尽量不要使用与语言相关的标示符)
2、Slice模块映射到C++名字空间。
3、Slice基本数据的bool和string映射到C++的bool和std::string,其他均映射到ice的跨平台数据类型
4、slice枚举映射到c++的枚举
5、slice结构映射到c++的同名结构,其成员变量映射成同名的c++成员变量。为了支持标准库的集合类型,
   每个结构中扩展了六个操作符函数,分别是==、!=、<、<=、>、>=
6、slice结构可以显示的映射成c++的类,需要在slice结构定义时加上metadata限制["cpp:class"],这样
   在生成的c++类定义中除了上述结构信息外,还会多两个构造函数
7、slice的sequence<>默认映射成std::vector<>。可通过增加额外的metadata改变其默认行为:
   例如映射成list: ["cpp:include:list"] ["cpp:type:std::list<>"] sequence
   例如映射成deque: ["cpp:include:deque"] ["cpp:type:std::deque<>"] sequence
   
   也可以映射成自定义数据类型:["cpp:include:mytype.h"] ["cpp:type:mytype"] sequence。当然要求自定义类型满足std容器的基本函数要求
   
   也可以通过["cpp:array"]Ice::ByteSeq映射成std::pair<const Ice::Byte*, const Ice::Byte*>,这种情况主要用于stl的迭代器访问场景,同时也是高效的
   数据传输方式,因为传递指针会减少内存拷贝过程。但是该处的指针不能再操作中持久化,因为操作完成后该指针指向内存区域即将释放
   
   也可以通过["cpp:range"]Ice::ByteSeq映射成std::pair<const Ice::ByteSeq::const_iterator, const Ice::ByteSeq::const_iterator>&,当然,该处也不能
   在操作中保存该迭代器,因为操作结束后盖迭代器即将失效
8、slice的dictionary<>默认映射成std::map<>
9、Slice常量定义映射到对应的C++常量定义
10、slice的异常被映射成c++的类,其数据成员和继承关系均被保留。但是在每个c++异常类中多出三个public的成员函数(构造函数除外):
    ice_name、ice_clone、ice_throw,分别用来获取异常名称、克隆异常、抛出异常本身
11、slice的接口映射成c++的代理类、代理句柄、实例指针,命名分别为IceProxy::<interface-name>、::<interface-name>Prx、::<interface-name>Ptr
    代理类IceProxy::<interface-name>继承自IceProxy::Ice::Object
代理句柄::<interface-name>Prx具备默认构造、拷贝构造、赋值操作符。同时具备两个静态的向下转型函数checkedCast、uncheckedCast
代理句柄::<interface-name>Prx支持可视化操作ice_toString,返回对象的名称标示
代理句柄::<interface-name>Prx支持常用比较操作:==、!=、<、<=、>、>=、布尔判断
接口的方法被映射成同名的c++方法,可见性public
接口的方法中参数被映射成同名的参数,其类型如果为基本类型,则被映射成Ice::XXX,string被映射成std::string,其他类型参考以前描述
接口的方法中参数如果为输入型参数,则在c++参数前加以const修饰,同时如果输入参数为复杂结构,则传递引用参数,如果为输出参数,则被标示成引用。
接口方法的调用在调用方来看,不用关心内存的申请和释放问题,都会由ice runtime管理。
接口方法在调用时,如果抛出异常,ice runtime会保证其输出参数、返回值不会被修改
12、Slice类映射到同名的C++ 类。
    对于每一个Slice数据成员,生成的类都有一个public 数据成员与之对应
对于每一个操作都有一个对应的纯虚成员函数
    生成的c++类继承自Ice::Object,该处注意和接口的基类不一样
slice为每个生成的类声明了一个只能指针<class-name>Ptr
每个类中还包含额外的一些方法:ice_isA、ice_id、ice_staticId(static),以及ice_factory(static)
由于映射生成类中所有方法都是纯虚的,因此需要扩展继承并实现其纯虚方法。
如果要将某一个映射的类作为参数返回或者输入,那么必需要告诉ice runtime如何创建这个类实例,那么就需要编写一个额外的工厂方法:
class ObjectFactory : public Ice::ObjectFactory 
{
    public:
        virtual Ice::ObjectPtr create(const std::string &) 
{
            return new ClassNameI;
        }
        
virtual void destroy() {}
    };
并将其告知ice runtime"ic->addObjectFactory(new ObjectFactory, "::ClassName");"
    ice::Object基类包含了一些特殊的方法:ice_isA、ice_ping、ice_id、ice_hash、ice_staticId(static),因此所有的映射类均可调用上述方法
13、对于为每个类生成的只能指针,具备如下特性:
    可以通过智能指针调用类的任何public方法
可以使用智能指针和null比较来判断指针是否为空
可以通过智能指针的clone方法来深度复制对象,但是深度复制的对象为基类对象,因此需要进行向下转型,类似如下操作:
DerivedIPtr p1 = new DerivedI;
    DerivedIPtr p2 = DerivedIPtr::dynamicCast(p1->clone());
所有的程序中创建的内存会在communicator释放的时候释放内存。但是为了防止运行过程中的内存泄露,可以通过显示的调用Ice::collectGarbage()进行内存回收
当然你可以配置ice的属性Ice.GC.Interval要求ice运行环境隔段时间自动进行内存回收

ICE的输入流和输出流

1、ICE提供流式接口InputStream来进行对象的解码操作,通过如下方法构造一个输入流对象:    InputStreamPtr createInputStream(const Ice::Co...
  • followshake
  • followshake
  • 2012年04月01日 22:40
  • 2037

ICE框架组件内部实现与特点

1,Ice::Application 此类中有一个main的方法,main的方法中调用了run()函数。 ICE框架的服务配置结构: class ResTransferServer : p...
  • weiqubo
  • weiqubo
  • 2015年01月15日 23:48
  • 2270

list::splice()函数详解

 list::splice实现list拼接的功能。将源list的内容部分或全部元素删除,拼插入到目的list。函数有以下三种声明:void splice ( iterator position, li...
  • bichenggui
  • bichenggui
  • 2009年10月15日 12:11
  • 37808

ICE笔记(05):服务器端Slice到C++映射

【colorado】本文将介绍服务器端的Slice到C++ 映射。客户端Slice到C++映射的内容也适用于服务器端。1、服务器端的主要流程从ICE的Hello World应用程序中可以看到,Ice运...
  • Colorado
  • Colorado
  • 2009年11月28日 20:19
  • 3078

ICE笔记(03):客户端Slice到C++映射

【colorado】按:本文是DPWI第6章的笔记。 客户端Slice到C++映射定义的是:怎样把Slice数据类型翻译成C++类型,客户怎样调用操作、传递参数、处理错误。C++映射线程安全,不存在内...
  • Colorado
  • Colorado
  • 2009年11月28日 16:18
  • 4197

[c++基础]valarray模板详解

还记得vector怎么使用吗?valarray类似vector,也是一个模板类,其主要被用来对一系列元素进行高速的数字计算,其与vector的主要区别在于以下两点 1、valarray定义了一组在两...
  • qq_16098721
  • qq_16098721
  • 2016年02月06日 12:28
  • 545

从C到C++(上)

从C语言到C++语言,是面向过程到面向对象编程的跨越。面向对象编程的特点就是继承和动态绑定。C++通过类的派生来实现继承,通过虚拟函数支持动态绑定,虚拟函数提供了一些封装类体系实现细节的方法。 面向对...
  • codebat
  • codebat
  • 2014年10月27日 16:58
  • 707

Slice到C++映射

按:本文是DPWI第6章的笔记。   客户端Slice到C++映射定义的是:怎样把Slice数据类型翻译成C++类型,客户怎样调用操作、传递参数、处理错误。C++映射线程安全,不存在内存管...
  • crazyhacking
  • crazyhacking
  • 2014年12月10日 15:27
  • 860

[C++模板技术] 类型映射为类型

将类型映射为类型的技术解决了: 1、模板函数不能偏特化 2、直接用未被使用的类型作为参数重载替代偏特化可能造成无意义的复杂局部变量构造 用法如下: template struct Type2Type ...
  • Kexiii
  • Kexiii
  • 2017年08月18日 15:37
  • 186

OpenCV学习笔记(13)-boosting

决策树很有用,但是他们并不是最好的分类器.在本节和下节,我们讲述两种计数:boosting和随机森林.它们在内部使用了决策树,所以继承了树的很多有用的性能(能够处理混合数据类型、没有归一化的数据、特征...
  • cc7829290
  • cc7829290
  • 2013年06月14日 10:41
  • 5325
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:slice的c++映射
举报原因:
原因补充:

(最多只允许输入30个字)