C++混合编程之idlcpp教程Python篇(8)
上一篇在这 C++混合编程之idlcpp教程Python篇(7)
第一篇在这 C++混合编程之idlcpp教程(一)
与前面的工程相似,工程PythonTutorial6中,同样加入了四个文件:PythonTutorial6.cpp, Tutorial6.cpp, Tutorial6.i, tutorial6.py。其中PythonTutorial6.cpp的内容基本和PythonTutorial5.cpp雷同,不再赘述。首先看一下Tutorial6.i的内容:
#import "../../paf/src/pafcore/typedef.i" namespace tutorial
{
template<N>
struct Vector3
{
Vector3();
Vector3(const Vector3& v);
Vector3(N a, N b, N c);
Vector3(const N* p);
N getLength();
N length get;
N lengthSquare get; static Vector3<N> s_zero; nocode N x;
nocode N y;
nocode N z;
nocode N v[#]; #{
union
{
struct
{
N x,y,z;
};
N v[];
};
#}
}; export Vector3<float>;
export Vector3<double>;
typedef Vector3<float> Vector3f;
typedef Vector3<double> Vector3d; #{
template<typename N>
Vector3<N> Vector3<N>::s_zero(, , ); template<typename N>
inline Vector3<N>::Vector3()
{
} template<typename N>
inline Vector3<N>::Vector3(const Vector3<N>& v) : x(v.x), y(v.y), z(v.z)
{} template<typename N>
inline Vector3<N>::Vector3(N a, N b, N c) : x(a), y(b), z(c)
{} template<typename N>
inline Vector3<N>::Vector3(const N* p) : x(p[]), y(p[]), z(p[])
{} template<typename N>
inline N Vector3<N>::getLength()
{
return N(sqrt(x * x + y * y + z * z));
} template<typename N>
inline N Vector3<N>::get_length()
{
return N(sqrt(x * x + y * y + z * z));
} template<typename N>
inline N Vector3<N>::get_lengthSquare()
{
return (x * x + y * y + z * z);
}
#}
}
template<N>
struct Vector3
这是一个模板类,C++的模板功能复杂强大,编译器实在难写。所以大多数C++模板的高级特性在idlcpp中都没有做支持,毕竟idlcpp只负责对脚本语言提供接口,有一些简单的模板功能就够用了。另外由于不准备支持数值做为模板参数,只支持类型做为模板参数。
static Vector3 s_zero;
这一行声明了一个静态成员变量。idlcpp支持静态成员变量,静态成员函数,静态属性(实际上也是静态成员函数)。
nocode N x;
nocode N y;
nocode N z;
nocode N v[#3];
#{
union
{
struct
{
N x,y,z;
};
N v[3];
};
#}
idlcpp 没有提供 union。好在可以通过nocode 和 #{#} 分别在生成的元数据描述代码和C++头文件提供各自的内容。
下面两行代码
export Vector3<float>;
export Vector3<double>;
用于生成元数据代码。idlcpp中通过这样的声明语句才会生成相应类型的元数据信息。
再下面两行代码
typedef Vector3<float> Vector3f;
typedef Vector3<double> Vector3d;
为模板类实例类型声明了类型别名。因为这两个类型名分别是::tutorial::Vector3<float> 和 ::tutorial::Vector3<double>,在脚本中使用不方便,有了类型别名之后就可以通过::tutorial::Vector3f和::tutorial::Vector3d来使用。
后面就是成员函数的实现代码,不在赘述。
编译后生成的Tutorial6.h的内容如下:
//DO NOT EDIT THIS FILE, it is generated by idlcpp
//http://www.idlcpp.org #pragma once namespace tutorial
{
template<typename N>
struct Vector3
{
public: Vector3();
Vector3(const Vector3& v);
Vector3(N a,N b,N c);
Vector3(const N* p);
N getLength();
N get_length();
N get_lengthSquare(); static Vector3<N> s_zero; union
{
struct
{
N x,y,z;
};
N v[];
}; }; typedef Vector3<float> Vector3f;
typedef Vector3<double> Vector3d; template<typename N>
Vector3<N> Vector3<N>::s_zero(, , ); template<typename N>
inline Vector3<N>::Vector3()
{
} template<typename N>
inline Vector3<N>::Vector3(const Vector3<N>& v) : x(v.x), y(v.y), z(v.z)
{} template<typename N>
inline Vector3<N>::Vector3(N a, N b, N c) : x(a), y(b), z(c)
{} template<typename N>
inline Vector3<N>::Vector3(const N* p) : x(p[]), y(p[]), z(p[])
{} template<typename N>
inline N Vector3<N>::getLength()
{
return N(sqrt(x * x + y * y + z * z));
} template<typename N>
inline N Vector3<N>::get_length()
{
return N(sqrt(x * x + y * y + z * z));
} template<typename N>
inline N Vector3<N>::get_lengthSquare()
{
return (x * x + y * y + z * z);
} }
idlcpp会为只读属性length和lengthSquare 生成对应的函数声明get_length和get_lengthSquare。
其他的内容,C++和idl基本上都是一样的。
然后是Tutorial6.cpp
#include "Tutorial6.h"
#include "Tutorial6.mh"
#include "Tutorial6.ic"
#include "Tutorial6.mc"
因为模板类的代码都写在头文件中了,所以Tutorial6.cpp只需要包含对应的四个文件即可。
最后看一下Tutorial6.py的内容
import pafpython;
paf = pafpython.paf; v1 = paf.tutorial.Vector3f.New(1,1,2);
v1.z = 1;
print(v1.length._); v2 = paf.tutorial.Vector3d(2,2,1);
v2.v[2] = 2;
print(v2.getLength()._);
编译执行,结果如下图:
C++混合编程之idlcpp教程Python篇(8)的更多相关文章
- C++混合编程之idlcpp教程Python篇(9)
上一篇在这 C++混合编程之idlcpp教程Python篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程PythonTutorial7中除了四个文件PythonTu ...
- C++混合编程之idlcpp教程Python篇(7)
上一篇在这 C++混合编程之idlcpp教程Python篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与PythonTutorial4工程相似,工程PythonTutorial5中,同 ...
- C++混合编程之idlcpp教程Python篇(6)
上一篇在这 C++混合编程之idlcpp教程Python篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程PythonTutorial4中加入了四个文件:PythonTutorial4 ...
- C++混合编程之idlcpp教程Python篇(5)
上一篇在这 C++混合编程之idlcpp教程Python篇(4) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial3中,同样加入了三个文件:Py ...
- C++混合编程之idlcpp教程Python篇(4)
上一篇在这 C++混合编程之idlcpp教程Python篇(3) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial2中,同样加入了三个文件 Pyt ...
- C++混合编程之idlcpp教程Python篇(3)
上一篇 C++混合编程之idlcpp教程Python篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用.这一篇会有新的内容. 与PythonTutorial0相似,工程Pyth ...
- C++混合编程之idlcpp教程Python篇(2)
在上一篇 C++混合编程之idlcpp教程(一) 中介绍了 idlcpp 工具的使用.现在对 idlcpp 所带的示例教程进行讲解,这里针对的 Python 语言的例子.首先看第一个示例程序 Pyth ...
- C++混合编程之idlcpp教程Lua篇(6)
上一篇在这 C++混合编程之idlcpp教程Lua篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程LuaTutorial4中加入了四个文件:LuaTutorial4.cpp, Tut ...
- C++混合编程之idlcpp教程Lua篇(9)
上一篇在这 C++混合编程之idlcpp教程Lua篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程LuaTutorial7中除了四个文件LuaTutorial7.c ...
随机推荐
- h5页面唤起app(iOS和Android),没有安装则跳转下载页面
浏览器和app没有通信协议,所以h5不知道用户的手机释放安装了app.因此只能是h5去尝试唤起app,若不能唤起,引导用户去下载我们的app. 微信里屏蔽了 schema 协议,如果在微信中打开h5, ...
- Tomcat单向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端安全通信
众所周知,iOS9已经开始在联网方面默认强制使用Https替换原来的Http请求了,虽然Http和Https各有各的优势,但是总得来说,到了现在这个安全的信息时代,开发者已经离不开Https了. 网上 ...
- PHP的文件格式应该以UTF-8无BOM编码
前一段时间写PHP,经常在解析文件之前就要对数据进行处理判断,并以header()的方式进行页面跳转.然而后来将文件放到 linux 服务器时常碰到header()解析出错的情况,而在 windows ...
- CPU虚拟化的常见技术
关键词:cpu虚拟化,KVM,Host-PassThrough,Nested,CGroup,NUMA,热添加 云计算虚拟化技术主要包括三个领域:计算.存储.网络 本文主要总结了计算虚拟化领域中的CPU ...
- php嵌套数组递归搜索返回数组key
var rewardTypes={"experience":{"\u7ecf\u9a8c\u503c":{"1":"\u660e\ ...
- 解决MVC中JSON字符长度超出限制的异常
解决MVC中JSON字符长度超出限制的异常 解决方法如下: <configuration> <system.web.extensions> <scripting> ...
- C#开发Android环境搭建
目前破解比较稳定的版本(我亲自尝试过的)是4.2. wuleba上的4.6,4.8,4.10 破解均会出现各种问题. 1 当前电脑账户最好是使用英文账号,而不要使用汉字,否则路径会出现乱码问题. 2 ...
- python脚本执行Scapy出现IPv6警告WARNING解决办法
安装完scapy,写了脚本执行后执行: WARNING: No route found for IPv6 destination :: (no default route?) 原因是用 from sc ...
- 2014NOIP前 计划
这几天天天刷水题活得很开心,是时候定一个计划了.想着我要在yzy左的吓人的歌声中看书,还是有点.... 大概就分成几类吧 数学//你们这群学霸啊 搜索 图论 dp 贪心 其他 每个不定具体时间,加油吧 ...
- 异常处理和JDBC
1.异常: 格式:try{ 要执行的可能出现异常的语句 } catch(Exception e){ 对异常进行处理的语句 } finally{ 一定会被处理的语句 //可以不写 } 当需要 ...