Matlab类用于同一数据的多个访问器

时间:2019-06-27 18:51:47

标签: c++ matlab class unions

我正在尝试将类从C ++转换为Matlab。在C ++中,可以使用多种方式访问​​相同的数据,因为这些值被声明为union

但是,似乎在Matlab中执行此操作的唯一方法是覆盖subsrefsubsasgn,这打开了一大堆必须解析方法的蠕虫。

有其他处理方式吗?我看到了2014年的一些评论,表明没有

这是有问题的C ++ enum

template <class T>
class Euler
{
    public:
       union
       {
          T m[3];
          struct
          {
             union { T x; T yaw; T psi; };       // m[0]
             union { T y; T pitch; T theta; };   // m[1]
             union { T z; T roll; T phi; };      // m[2]
          };
       };
};

1 个答案:

答案 0 :(得分:2)

简单的解决方案:忘记这些名称,并将此类转换为简单的数组,将m.x索引为m[1],将m.roll索引为m[2],依此类推。在某些用例中并不是很好,但肯定是最有效的解决方案。

替代解决方案需要创建一个自定义类。 subsrefsubsasgn不是必需的,可以声明依赖的属性并定义getter和setter(尽管它并不漂亮!):

classdef Euler
    properties
       x = 0;
       y = 0;
       z = 0;
    end
    properties (Dependent)
       yaw, pitch, roll;
       psi, theta, phi;
    end
    methods
        function value = get.yaw(obj)
            value = obj.x;
        end
        function value = get.pitch(obj)
            value = obj.y;
        end
        function value = get.roll(obj)
            value = obj.z;
        end
        function obj = set.yaw(obj,value)
            obj.x = value;
        end
        function obj = set.pitch(obj,value)
            obj.y = value;
        end
        function obj = set.roll(obj,value)
            obj.z = value;
        end
        % Add same methods for psi, theta, phi.
    end
end

您现在可以这样做:

e = Euler;
e.x = 1;
e.yaw    % returns 1
e.roll = 5;
e.z      % returns 5

也就是说,该对象具有属性xyzyawpitchroll(在添加了适当的设置程序和获取程序也psithetaphi),但仅存储三个值。例如的值yawx已链接,并且始终相同。