繁体   English   中英

返回类型取决于参数数量的重载可变参数函数

[英]overload variadic function with return type dependent on number of parameters

我正在编写一个多维数组类,其维数直到运行时才知道。

我已经到达下标运算符,并且想要复制多维本机数组的行为,以便:

  • 当使用的下标少于尺寸数时,它将返回一个数组(可能称为“视图”)
  • 当使用的下标数量等于尺寸数时,它将返回存储在该位置的值

返回类型是否可能取决于传递给函数的参数数量与直到运行时才知道的值(维数)之间的关系?

其他资讯:

  • 我通过使用平面数组和数学运算来确定正确的索引,将其实现为sudo多维数组。
  • 我将下标运算符写为可变参数函数(非模板)。

要求,

  • 使用...时,它将返回一个数组
  • 使用...时,它将返回值

与标准(1.3.11)相矛盾-方法或运算符不能在返回类型上重载。 因此,从本质上讲,您不可能拥有以下简单的东西:

class MyIndex; // defined elsewhere
template <typename T> struct MyArray {
   const std::array<T>& operator[] (const MyIndex& x) {...}
   const T&             operator[] (const MyIndex& x) {...}
   const T&             operator[] (int, int, int) {...}
};

如注释中所述,您可以返回boost::variant或您自己的对象。 当然,变体是更好的主意。 您自己的对象的优点是您可以直接控制转换,但是我不认为这是一个特别好的主意:

class Result; 
...
struct MyArrray {
   const Result& operator[] (const MyIndex& x) {...}
   const Result& operator[] (int, int, int) {...}

然后为Result添加用户定义的转换,或者可能添加单独的getter操作以检查和检索值:

class Result {
    bool hasInt() const;
    operator int() const { /* throw if wraps a view else return the value */ }  
    bool hasView() const;
    operator MyArray() const { /* throw if wraps a value else return your array as a view */ }  

};

您已经可以注意到,这很快就变成了泥潭。 这将很难维护,难以推理,并且您的代码对读者或审阅者而言也不会明确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM