访问具有重载索引引用的类的方法和属性

时间:2012-01-13 15:07:51

标签: matlab operator-overloading

我希望通过(){}为我的一个MATLAB类重载索引。这可以通过为该类实现subsref来实现,并且可以正常工作。

但是,我还希望通过.保持索引的默认行为(即访问方法和属性)。我尝试使用以下代码:

function x = subsref(this, S)
    if strcmp(S(1).type, '{}')
        % My own implementation here
    elseif strcmp(S(1).type, '()')
        % My own implementation here
    elseif strcmp(S(1).type, '.')
        x = builtin('subsref', this, S);
    else
        error('Unknown index variant.');
end

但是,这不起作用,因为我不知道调用builtin('subsref', this, S)将返回多少输出参数。特别是,我的类的方法可能返回可变数量的参数,输出参数的数量取决于其输入参数的数量和值。一个MATLAB example for subsref笔记:

When you implement a subsref method for a class, you must 
implement all subscripted reference explicitly [...]

这真的是唯一可行的解​​决方案吗?对于复杂的方法,这基本上意味着复制了很多逻辑。在我的情况下,这肯定是不可维护的(具有大量方法和属性的大型类)。

注意:我知道这完全是关于语法糖的,我总是可以使用标准方法调用而不是重载(){}

1 个答案:

答案 0 :(得分:3)

对于部分修复,我认为你可以使用nargout来推迟调用者,调用者通常可以知道。任何捕获多个输出的函数必须在通话时知道它捕获了多少。

这不会让你在命令行显示多个argouts,但是只要你正在捕获返回的值,就像在大多数代码中一样。

function varargout = subsref(this, S)
   switch S(1).type
      ...
      case '.'
         varargout = cell(1, nargout);
         if nargout == 0
             builtin('subsref', this, S);
         else
             [varargout{:}] = builtin('subsref', this, S);
         end
   end
end

警告:这段代码没有经过测试,在subsref / subsasgn内部有一堆挑剔的边缘情况。