c++ - 重载可变参数函数,返回类型取决于参数数量

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

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

我已经了解下标运算符并想复制多维 native 数组的行为,以便:

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

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

其他信息:

  • 我通过使用平面数组和数学来确定正确的索引,将其实现为 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 */ }  

};

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

关于c++ - 重载可变参数函数,返回类型取决于参数数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20554606/

相关文章:

c# - 从 PowerShell cmdlet 返回对象

c++ - 函数返回一个由 vector ​​组成的元组

c++ - 奇怪的迭代器行为 + unordered_set 的段错误

c++ - 使用部分类型知识访问模板的参数

c++ - const 和数组结构字段的列表初始化

java - 从 java 中的 lambda forEach() 返回

c# - C#[在Unity中]和C++之间的命名管道

c++ - 容器类 C++ 的循环

c++ - 如何在 opencv C++ 中访问特定的超像素

java - 由各种类型的对象组成的ArrayList