上一篇在这 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)的更多相关文章

  1. C++混合编程之idlcpp教程Lua篇(9)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程LuaTutorial7中除了四个文件LuaTutorial7.c ...

  2. C++混合编程之idlcpp教程Lua篇(7)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与LuaTutorial4工程相似,工程LuaTutorial5中,同样加入了四个文件: ...

  3. C++混合编程之idlcpp教程Lua篇(6)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程LuaTutorial4中加入了四个文件:LuaTutorial4.cpp, Tut ...

  4. C++混合编程之idlcpp教程Lua篇(5)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(4) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程LuaTutorial3中,同样加入了三个文件:LuaTutori ...

  5. C++混合编程之idlcpp教程Lua篇(4)

    上一篇在这  C++混合编程之idlcpp教程Lua篇(3) 与前面的工程相似,工程LuaTutorial2中,同样加入了三个文件 LuaTutorial2.cpp, Tutorial2.i, tut ...

  6. C++混合编程之idlcpp教程Lua篇(3)

    上一篇 C++混合编程之idlcpp教程Lua篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用.这一篇会有新的内容. 与LuaTutorial0相似,工程LuaTutoria ...

  7. C++混合编程之idlcpp教程Lua篇(2)

    在上一篇 C++混合编程之idlcpp教程(一) 中介绍了 idlcpp 工具的使用.现在对 idlcpp 所带的示例教程进行讲解,这里针对的 Lua 语言的例子.首先看第一个示例程序 LuaTuto ...

  8. C++混合编程之idlcpp教程Python篇(7)

    上一篇在这 C++混合编程之idlcpp教程Python篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与PythonTutorial4工程相似,工程PythonTutorial5中,同 ...

  9. C++混合编程之idlcpp教程Python篇(6)

    上一篇在这 C++混合编程之idlcpp教程Python篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程PythonTutorial4中加入了四个文件:PythonTutorial4 ...

随机推荐

  1. linux学习之——vim简明教程

    摘自  http://blog.csdn.net/niushuai666/article/details/7275406 ——————————正文开始—————————— 你想以最快的速度学习人类史上 ...

  2. $.each与$().each

    在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法.两个方法是有区别的,从而这两个方法在针对不同的操作上,显示了各自的特点. $().each,对于这个方法,在d ...

  3. 添加了有道生词本的 chrome google翻译扩展和有道翻译扩展

    在chrome发布项目,需要先花美金认证,还得要美国ID,无奈. 直接上源码,需手动导入. 原始项目源码并未开源,个人是从chrome本地文件里拿出来的,拓展来的,侵删(本来想着自已写一个,业余时间, ...

  4. Abp项目中的领域模型实体类访问仓储的方法

    首先声明,不推荐使用这种方法.实体访问仓储是不被推荐的! 1.简单粗暴的方法 Abp.Dependency.IocManager.Instance.Resolve>(); 2.绕个弯子的方法 首 ...

  5. 百度UEditor基本使用

    1 首先奉上链接其http://ueditor.baidu.com/website/index.html 更多更详细内容在其官方api上,本文只是一个归类总结性文章. 2 下载链接http://ued ...

  6. discuz二次开发,分析和实现 之 向dz数据库插入自己的帖子吧

    发个博客太麻烦了,难怪写博客的越来越少,吐一下,cnblogs的编辑器模板太丑! 最近开发社区 需要采集一些数据,使得模板输出有图文效果.就写了个简单的采集脚本,爬取目标站的内容,(用php 下载图片 ...

  7. dp、px、dpi、ppi

    概念: dpi(Dots Per Inch):每英寸上的点数,最初用于衡量打印物上每英寸的点数密度,打印机在一英寸内打多少个点.DPI值越小越不精细. ppi(Pixels Per Inch):每英寸 ...

  8. php特性包括哪些?

    PHP的特性包括: 1. PHP 独特的语法混合了 C.Java.Perl 以及 PHP 自创新的语法. 2. PHP可以比CGI或者Perl更快速的执行动态网页——动态页面方面,与其他的编程语言相比 ...

  9. CSS实现完美垂直居中

    之前看到很多人一直都问这个问题,不过当时我没当一回事,因为在 CSS 中要垂直居中,多数是在有高度的情况下,或者容器高度不定的情况下才用,看上去比较舒服,而且实现的方法也不少,不一定要拘泥于和 tab ...

  10. 检查或遍历android手机应程

    检查android手机中是否存在某应程 public boolean checkApp(String packageName) {        if (packageName == null || ...