zoukankan      html  css  js  c++  java
  • 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[#3]; #{ union { struct { N x,y,z; }; N v[3]; }; #} }; export Vector3<float>; export Vector3<double>; typedef Vector3<float> Vector3f; typedef Vector3<double> Vector3d; #{ template<typename N> Vector3<N> Vector3<N>::s_zero(0, 0, 0); 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[0]), y(p[1]), z(p[2]) {} 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[3];
            };
            
        };
    
    
    
        typedef Vector3<float> Vector3f;
        typedef Vector3<double> Vector3d;
    
    
        template<typename N>
        Vector3<N> Vector3<N>::s_zero(0, 0, 0);
    
        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[0]), y(p[1]), z(p[2])
        {}
    
        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(1,1,2);
    v1.z = 1;
    print(v1.length._);
    
    v2 = paf.tutorial.Vector3d(2,2,1);
    v2.v[2] = 2;
    print(v2:getLength()._);


     

    编译执行,结果如下图:

  • 相关阅读:
    Android:简单联网获取网页代码
    nginx搭建前端项目web服务器以及利用反向代理调试远程后台接口
    ElementUI使用问题记录:设置路由+iconfont图标+自定义表单验证
    vue中引入第三方字体图标库iconfont,及iconfont引入彩色图标
    Axios使用文档总结
    使用node中的express解决vue-cli加载不到dev-server.js的问题
    Vue脚手架(vue-cli)搭建和目录结构详解
    JS夯实基础:Javascript 变态题解析 (下)
    理解JS里的稀疏数组与密集数组
    JS夯实基础:Javascript 变态题解析 (上)
  • 原文地址:https://www.cnblogs.com/fdyjfd/p/5479942.html
Copyright © 2011-2022 走看看