我正在尝试将类从C ++转换为Matlab。在C ++中,可以使用多种方式访问相同的数据,因为这些值被声明为union
。
但是,似乎在Matlab中执行此操作的唯一方法是覆盖subsref
和subsasgn
,这打开了一大堆必须解析方法的蠕虫。
有其他处理方式吗?我看到了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]
};
};
};
答案 0 :(得分:2)
简单的解决方案:忘记这些名称,并将此类转换为简单的数组,将m.x
索引为m[1]
,将m.roll
索引为m[2]
,依此类推。在某些用例中并不是很好,但肯定是最有效的解决方案。
替代解决方案需要创建一个自定义类。 subsref
和subsasgn
不是必需的,可以声明依赖的属性并定义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
也就是说,该对象具有属性x
,y
,z
,yaw
,pitch
和roll
(在添加了适当的设置程序和获取程序也psi
,theta
和phi
),但仅存储三个值。例如的值yaw
和x
已链接,并且始终相同。