C++混合编程之idlcpp教程Lua篇(8)
上一篇在这 C++混合编程之idlcpp教程Lua篇(7)
第一篇在这 C++混合编程之idlcpp教程(一)
与前面的工程相似,工程LuaTutorial6中,同样加入了四个文件:LuaTutorial6.cpp, Tutorial6.cpp, Tutorial6.i, tutorial6.lua。其中LuaTutorial6.cpp的内容基本和LuaTutorial5.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.lua的内容
- v1 = paf.tutorial.Vector3f(,,);
- v1.z = ;
- print(v1.length._);
- v2 = paf.tutorial.Vector3d(,,);
- v2.v[] = ;
- print(v2:getLength()._);
编译执行,结果如下图:
C++混合编程之idlcpp教程Lua篇(8)的更多相关文章
- C++混合编程之idlcpp教程Lua篇(9)
上一篇在这 C++混合编程之idlcpp教程Lua篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程LuaTutorial7中除了四个文件LuaTutorial7.c ...
- C++混合编程之idlcpp教程Lua篇(7)
上一篇在这 C++混合编程之idlcpp教程Lua篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与LuaTutorial4工程相似,工程LuaTutorial5中,同样加入了四个文件: ...
- C++混合编程之idlcpp教程Lua篇(6)
上一篇在这 C++混合编程之idlcpp教程Lua篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程LuaTutorial4中加入了四个文件:LuaTutorial4.cpp, Tut ...
- C++混合编程之idlcpp教程Lua篇(5)
上一篇在这 C++混合编程之idlcpp教程Lua篇(4) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程LuaTutorial3中,同样加入了三个文件:LuaTutori ...
- C++混合编程之idlcpp教程Lua篇(4)
上一篇在这 C++混合编程之idlcpp教程Lua篇(3) 与前面的工程相似,工程LuaTutorial2中,同样加入了三个文件 LuaTutorial2.cpp, Tutorial2.i, tut ...
- C++混合编程之idlcpp教程Lua篇(3)
上一篇 C++混合编程之idlcpp教程Lua篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用.这一篇会有新的内容. 与LuaTutorial0相似,工程LuaTutoria ...
- C++混合编程之idlcpp教程Lua篇(2)
在上一篇 C++混合编程之idlcpp教程(一) 中介绍了 idlcpp 工具的使用.现在对 idlcpp 所带的示例教程进行讲解,这里针对的 Lua 语言的例子.首先看第一个示例程序 LuaTuto ...
- C++混合编程之idlcpp教程Python篇(7)
上一篇在这 C++混合编程之idlcpp教程Python篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与PythonTutorial4工程相似,工程PythonTutorial5中,同 ...
- C++混合编程之idlcpp教程Python篇(6)
上一篇在这 C++混合编程之idlcpp教程Python篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程PythonTutorial4中加入了四个文件:PythonTutorial4 ...
随机推荐
- javascript函数声明方式
javascript中函数的声明有三种方式: 最常见的函数声明: fun();//可以调用,因为这种声明方式会被浏览器优先加载. function fun() { alert("声明式的函数 ...
- PHP从mysqli中获取的资源$result是不是不能while($row = $result->fetch_assoc())这样两次?【坑】
PHP从mysqli中获取的资源$result是不是不能while($row = $result->fetch_assoc())这样两次? 因为我这样做,结果后面的查询结果就无法显示了,目前尚不 ...
- HTML超标记语言
Html超文本标记语言,负责描绘Web世界的骨架. 〇.工具 http;//www.w3cchool.com.cn 一.Tim Bemers Lee 万维网之父: Html设计者: W3C创始人: ...
- NC nc5.x笔记(编辑中)
一.设置卡片界面下 金额字段负数为红色! /** * 设置卡片界面下 金额字段负数为红色! */ private void repaintBodyMoneyColor(){ if(!isListPan ...
- 安装pillow错误的解决方案
错误信息: ValueError: jpeg is required unless explicitly disabled using --disable-jpeg, aborting ...
- dedecms内容管理系统学习
在复习完基础知识和学习了tp3.2之后,我们开始学习一些开源的产品,如dedecms:
- [转]Snappy压缩库安装和使用之一
Snappy压缩库安装和使用之一 原文地址:http://blog.csdn.net/luo6620378xu/article/details/8521223 近日需要在毕业设计中引入一个压缩库,要求 ...
- 先学习下一些基础的js和xpath语法
这两个方法到底是在做什么呢?其实就是克隆了当前指令的节点,并生成子作用域.克隆的节点由transclude定义,如果你的属性是true,则克隆的是指令模板中的ng-transclude所在的DOM节点 ...
- C语言打印最长字符串
编程在一个已知的字符串中找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词. ]; printf("请输入字符串:"); fgets(p, , stdin); ; ; ; ...
- k次出现与一次出现的数字
原始的题目是这样的: Single Number II Given an array of integers, every element appears three times except for ...