过载可变参数函数,返回类型取决于参数个数

时间:2013-12-12 21:26:53

标签: c++ c++11 return-type variadic-functions

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

我已经使用了下标运算符,并希望复制多维本机数组的行为,以便:

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

是否可以使返回类型取决于传递给函数的参数数量与在运行时之前未知的值(维数)之间的关系?

其他信息:

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

1 个答案:

答案 0 :(得分:1)

要求,

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

与标准(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 */ }  

};

你已经注意到这很快就会成为一个泥潭。它很难维护,很难推理,你的代码也不会对读者或评论者明确。