我正在编写一个多维数组类,直到运行时才知道维数。
我已经使用了下标运算符,并希望复制多维本机数组的行为,以便:
是否可以使返回类型取决于传递给函数的参数数量与在运行时之前未知的值(维数)之间的关系?
其他信息:
答案 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 */ }
};
你已经注意到这很快就会成为一个泥潭。它很难维护,很难推理,你的代码也不会对读者或评论者明确。