zoukankan      html  css  js  c++  java
  • C++混合编程之idlcpp教程Python篇(9)

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

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

     

    与前面的工程相比,工程PythonTutorial7中除了四个文件PythonTutorial7.cpp, Tutorial7.cpp, Tutorial7.i, tutorial7.py 外,Tutorial6.cpp也被加入了此工程中。其中PythonTutorial7.cpp的内容基本和PythonTutorial6.cpp雷同,不再赘述。首先看一下Tutorial7.i的内容:

    #import "Tutorial6.i"
    
    namespace tutorial
    {
      template<T>
    struct Ray3 { Ray3(); Ray3(const Vector3<T>& origin, const Vector3<T>& direction); void getPoint(Vector3<T>& point, T t) const; Vector3<T> getPoint(T t) const; Vector3<T> m_origin; Vector3<T> m_direction; }; export Ray3<float>; export Ray3<double>; typedef Ray3<float> Ray3f; typedef Ray3<double> Ray3d; #{ template<typename T> inline Ray3<T>::Ray3() {} template<typename T> inline Ray3<T>::Ray3(const Vector3<T>& origin, const Vector3<T>& direction) : m_origin(origin), m_direction(direction) {} template<typename T> inline void Ray3<T>::getPoint(Vector3<T>& point, T t) const { point.x = m_origin.x + m_direction.x * t; point.y = m_origin.y + m_direction.y * t; point.z = m_origin.z + m_direction.z * t; } template<typename T> inline Vector3<T> Ray3<T>::getPoint(T t) const { return Vector3<T>(m_origin.x + m_direction.x * t, m_origin.y + m_direction.y * t, m_origin.z + m_direction.z * t); } #} }

    第一行

    #import "Tutorial6.i"

    在后面Ray3的定义中使用到了模板类Vector3,所以在此处要先引入此文件。

    template<T>

    struct Ray3

    此处定义了模板类Ray3。其中有类型为Vector3<T>的两个成员变量m_origin和m_direction。在这个类中以 m_origin + m_direction * t  (t >= 0) 参数方程的形式表示一个射线。有两个名为getPoint的重载函数用来获取射线上的一点坐标。

    export Ray3<float>;

    export Ray3<double>;

    模板实例化,这两行代码指示idlcpp生成相应类型的元数据信息。

    typedef Ray3<float> Ray3f;

    typedef Ray3<double> Ray3d;

    定义类型别名,方便使用。

    编译后生成的Tutorial7.h的内容如下:

    //DO NOT EDIT THIS FILE, it is generated by idlcpp
    //http://www.idlcpp.org
    
    #pragma once
    
    #include "./Tutorial6.h"
    
    namespace tutorial
    {
        template<typename T>
        struct Ray3
        {
        public:
    
            Ray3();
            Ray3(const Vector3<T>& origin,const Vector3<T>& direction);
            void getPoint(Vector3<T>& point,T t)const ;
            Vector3<T> getPoint(T t)const ;
            Vector3<T> m_origin;
            Vector3<T> m_direction;
        };
    
    
    
        typedef Ray3<float> Ray3f;
        typedef Ray3<double> Ray3d;
    
    
    
    
        template<typename T>
        inline Ray3<T>::Ray3()
        {}
    
        template<typename T>
        inline Ray3<T>::Ray3(const Vector3<T>& origin, const Vector3<T>& direction) :
            m_origin(origin), m_direction(direction)
        {}
    
        template<typename T>
        inline void Ray3<T>::getPoint(Vector3<T>& point, T t) const
        {
            point.x = m_origin.x + m_direction.x * t;
            point.y = m_origin.y + m_direction.y * t;
            point.z = m_origin.z + m_direction.z * t;
        }
        template<typename T>
        inline Vector3<T> Ray3<T>::getPoint(T t) const
        {
            return Vector3<T>(m_origin.x + m_direction.x * t,
                m_origin.y + m_direction.y * t,
                m_origin.z + m_direction.z * t);
        }
    
        
    }

    然后是Tutorial7.cpp

    #include "Tutorial7.h"
    #include "Tutorial7.mh"
    #include "Tutorial7.ic"
    #include "Tutorial7.mc"

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

    另外模板类Ray3用到了模板类Vector3,所以其实例化类型Ray3<float>和Ray3<double>也分别用到Vector3的实例化类型Vector3<float>和Vector3<double>,相应的Ray3<float>元数据中也会用到Vector3<float>的元数据信息。所以在这个工程中需要将Tutorial6.cpp加入进来。

    最后看一下Tutorial7.py的内容

    p = paf.float.NewArray(3);
    p[0] = 1;
    p[1] = 2;
    p[2] = 3;
    ray = paf.tutorial.Ray3f(paf.tutorial.Vector3f.s_zero, paf.tutorial.Vector3f(p));
    pt = paf.tutorial.Vector3f(0,0,0);
    ray.getPoint(pt, 2);
    print(pt.x._);
    print(pt.y._);
    print(pt.z._);
    pt = ray.getPoint(3);
    print(pt.x._);
    print(pt.y._);
    print(pt.z._);

    第一行:

    p = paf.float.NewArray(3);

    创建一个float类型的数组,共三个元素,其中float是内置的类型。C++的原生类型在idlcpp中都是支持的,如下:

    bool
    char
    signed char
    unsigned char
    wchar_t
    short
    unsigned short
    long    
    unsigned long
    long long
    unsigned long long
    int
    unsigned int    
    float
    double
    long double

    考虑到有些类型中间有空格,为脚本使用方便,还为这些类型定义了别名,具体参见pafcore中的Typedef.i

    编译执行,结果如下图:

  • 相关阅读:
    南京师范大学2021年高等代数考研试卷
    有限阶全图边图两种颜色后同色三角形数量最少为?(2019年清华大学丘成桐数学英才班)
    关于三个变元的正整数解(2019年清华大学丘成桐数学英才班)
    [Oracle工程师手记]归档日志产生量太大时的简易分析手段
    [Oracle 工程师手记] 如何查看 FRA 的使用率
    [Oracle数据库工程师手记] Data Guard broker 与 ORA-32701
    [Oracle工程师手记]CRSD 进程与 password 文件
    [oracle 工程师手记]RMAN duplicate 发生ORA-19504、ORA-17502、ORA-15001、ORA-27140 错误的解决过程
    [Oracle工程师手记] 备份恢复双城记(三)
    [Oracle工程师手记] 备份恢复双城记(二)
  • 原文地址:https://www.cnblogs.com/fdyjfd/p/5844176.html
Copyright © 2011-2022 走看看