上一篇在这 C++混合编程之idlcpp教程Python篇(7)

第一篇在这 C++混合编程之idlcpp教程(一)

与前面的工程相似,工程PythonTutorial6中,同样加入了四个文件:PythonTutorial6.cpp, Tutorial6.cpp, Tutorial6.i, tutorial6.py。其中PythonTutorial6.cpp的内容基本和PythonTutorial5.cpp雷同,不再赘述。首先看一下Tutorial6.i的内容:

  1. #import "../../paf/src/pafcore/typedef.i"
  2.  
  3. namespace tutorial
  4. {
      template<N>
  5. struct Vector3
  6. {
  7. Vector3();
  8. Vector3(const Vector3& v);
  9. Vector3(N a, N b, N c);
  10. Vector3(const N* p);
  11. N getLength();
  12. N length get;
  13. N lengthSquare get;
  14.  
  15. static Vector3<N> s_zero;
  16.  
  17. nocode N x;
  18. nocode N y;
  19. nocode N z;
  20. nocode N v[#];
  21.  
  22. #{
  23. union
  24. {
  25. struct
  26. {
  27. N x,y,z;
  28. };
  29. N v[];
  30. };
  31. #}
  32. };
  33.  
  34. export Vector3<float>;
  35. export Vector3<double>;
  36. typedef Vector3<float> Vector3f;
  37. typedef Vector3<double> Vector3d;
  38.  
  39. #{
  40. template<typename N>
  41. Vector3<N> Vector3<N>::s_zero(, , );
  42.  
  43. template<typename N>
  44. inline Vector3<N>::Vector3()
  45. {
  46. }
  47.  
  48. template<typename N>
  49. inline Vector3<N>::Vector3(const Vector3<N>& v) : x(v.x), y(v.y), z(v.z)
  50. {}
  51.  
  52. template<typename N>
  53. inline Vector3<N>::Vector3(N a, N b, N c) : x(a), y(b), z(c)
  54. {}
  55.  
  56. template<typename N>
  57. inline Vector3<N>::Vector3(const N* p) : x(p[]), y(p[]), z(p[])
  58. {}
  59.  
  60. template<typename N>
  61. inline N Vector3<N>::getLength()
  62. {
  63. return N(sqrt(x * x + y * y + z * z));
  64. }
  65.  
  66. template<typename N>
  67. inline N Vector3<N>::get_length()
  68. {
  69. return N(sqrt(x * x + y * y + z * z));
  70. }
  71.  
  72. template<typename N>
  73. inline N Vector3<N>::get_lengthSquare()
  74. {
  75. return (x * x + y * y + z * z);
  76. }
  77. #}
  78. }

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的内容如下:

  1. //DO NOT EDIT THIS FILE, it is generated by idlcpp
  2. //http://www.idlcpp.org
  3.  
  4. #pragma once
  5.  
  6. namespace tutorial
  7. {
  8. template<typename N>
  9. struct Vector3
  10. {
  11. public:
  12.  
  13. Vector3();
  14. Vector3(const Vector3& v);
  15. Vector3(N a,N b,N c);
  16. Vector3(const N* p);
  17. N getLength();
  18. N get_length();
  19. N get_lengthSquare();
  20.  
  21. static Vector3<N> s_zero;
  22.  
  23. union
  24. {
  25. struct
  26. {
  27. N x,y,z;
  28. };
  29. N v[];
  30. };
  31.  
  32. };
  33.  
  34. typedef Vector3<float> Vector3f;
  35. typedef Vector3<double> Vector3d;
  36.  
  37. template<typename N>
  38. Vector3<N> Vector3<N>::s_zero(, , );
  39.  
  40. template<typename N>
  41. inline Vector3<N>::Vector3()
  42. {
  43. }
  44.  
  45. template<typename N>
  46. inline Vector3<N>::Vector3(const Vector3<N>& v) : x(v.x), y(v.y), z(v.z)
  47. {}
  48.  
  49. template<typename N>
  50. inline Vector3<N>::Vector3(N a, N b, N c) : x(a), y(b), z(c)
  51. {}
  52.  
  53. template<typename N>
  54. inline Vector3<N>::Vector3(const N* p) : x(p[]), y(p[]), z(p[])
  55. {}
  56.  
  57. template<typename N>
  58. inline N Vector3<N>::getLength()
  59. {
  60. return N(sqrt(x * x + y * y + z * z));
  61. }
  62.  
  63. template<typename N>
  64. inline N Vector3<N>::get_length()
  65. {
  66. return N(sqrt(x * x + y * y + z * z));
  67. }
  68.  
  69. template<typename N>
  70. inline N Vector3<N>::get_lengthSquare()
  71. {
  72. return (x * x + y * y + z * z);
  73. }
  74.  
  75. }

idlcpp会为只读属性length和lengthSquare 生成对应的函数声明get_length和get_lengthSquare。

其他的内容,C++和idl基本上都是一样的。

然后是Tutorial6.cpp

  1. #include "Tutorial6.h"
  2. #include "Tutorial6.mh"
  3. #include "Tutorial6.ic"
  4. #include "Tutorial6.mc"

因为模板类的代码都写在头文件中了,所以Tutorial6.cpp只需要包含对应的四个文件即可。

最后看一下Tutorial6.py的内容

  1. import pafpython;
  2. paf = pafpython.paf;
  3.  
  4. v1 = paf.tutorial.Vector3f.New(1,1,2);
  5. v1.z = 1;
  6. print(v1.length._);
  7.  
  8. v2 = paf.tutorial.Vector3d(2,2,1);
  9. v2.v[2] = 2;
  10. print(v2.getLength()._);

编译执行,结果如下图:

C++混合编程之idlcpp教程Python篇(8)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. io流导出csv

    @RequestMapping("/doExport") public void doExport(Model model, @RequestParam(value = " ...

  2. XUtils——GET请求

    //HttpUtils实例化对象     HttpUtils http = new HttpUtils();       /*                *发送请求send(HttpMethod ...

  3. mac 端口转发方案

    mac 端口映射 好坑 osx10.10mac移除了ipfw改用pfpf以前没用过 查文档mac的 pf语法,没有找到.bsd的倒是很全,心喜拿来一试.http://www.openbsd.org/f ...

  4. 各大门户网站的css初始化代码

    腾讯QQ官网 css样式初始 body,ol,ul,h1,h2,h3,h4,h5,h6,p,th,td,dl,dd,form,fieldset,legend,input,textarea,select ...

  5. DataSet用法详细 转

    DataSet用法详细 转 DataSet用法详细 一.特点介绍 1.处理脱机数据,在多层应用程序中很有用. 2.可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法. 3.处理分级 ...

  6. Crystal Reports拉报表报错:Error detected by database DLL

    问题描述: 最近在使用Crystal Reports打印报表时,提示错误信息:"Error detected by database DLL." 如下图: 经查找,是因为数据库名称 ...

  7. java开发常用工具

    1.eclipse3.6 +浏览器插件+findbug+checkstyle+pmd+svn 2.plsql8.0对数据库的操作,存储过程的调试 3.Securecrt对linux服务器的操作 4.e ...

  8. 【extjs】:获取列名,时间转换

    1.日期字符戳转时间 renderer : function(value, arg2) {                if (value != null && value != ' ...

  9. wpf 空白汉字占位符

    <TextBlock xml:space="preserve" Text="主  编" />   表示一个汉字占位符

  10. winfrom 捕获是否点击关闭按钮关闭的窗体

    const int WM_SYSCOMMAND = 0x0112; const int SC_CLOSE = 0xF060; protected override void WndProc(ref M ...