如何超载>>运算符采用变量参数列表

时间:2013-09-23 01:44:15

标签: c++ operator-overloading

我想重载'>>'运算符,以便某人可以输入任意数量的值。

这是我正在进行的作业的要求verbatum:

  

操作员及GT;>应该期望看到以下形式的输入:d v1 v2 ...   vd,其中d是向量的维数,每个vi是   与向量中的索引i对应的值。

我认为它的工作方式是第一个值是数组的大小(包含在对象Vex中),其余的是元素。所以,如果他们要输入

Vex vX;
4, 1, 2, 3, 4 >> vX; 

vX将创建一个大小为4的动态数组,其中包含数字1-4。

我挂断的主要部分是如何编程>>重载因为会有可变数量的参数。

理想情况下,我会找到...的效果的解决方案(这只是一个例子):

std::istream& Vex::operator>>(istream& is, const Vex&){
   /*
     Assume int * data has been previously declared in constructor
     data = new int[iterator[0]]
     create iterator of input for istream
     For n from 1 to iterator[0]...
         data[n] = iterator[n] 
   */
}

我只是不知道该怎么做。我一直在环顾四周,我找到了istream_iterator,但我找不到有人使用它的方式我需要使用它的任何好例子。

我希望我提供的信息足以回答这个问题。如果没有,请告诉我。

非常感谢你的时间。

4 个答案:

答案 0 :(得分:8)

您的老师并没有要求您重载operator>>来获取变量参数列表。他要求你以这样的方式重载operator>>,它在运行时解析变量长度输入,由用户(或文件或任何istream对象)给出。您需要的签名是:

std::istream& operator>>(istream& is, Vex& v)

它不应该是会员功能,但你可能需要它成为朋友。

我对这个Vex类一无所知,所以我不能告诉你如何写这个函数,但它会是这样的:

read an integer N from the stream
set size of Vex object as N, however that's done
for i = 1 to N
    read number X from the stream
    store X in Vex object at position i

答案 1 :(得分:0)

您的参数列表需要以逗号分隔,然后您可以在一次operator<<调用中传递其中的几个。

OpenCV就是这样做的。以下是它的使用方法(搜索逗号分隔): http://docs.opencv.org/modules/core/doc/basic_structures.html?highlight=comma-separated#mat

在这里查看一下cv::Mat_的代码: https://github.com/Itseez/opencv/blob/master/modules/core/include/opencv2/core/matx.hpp第840行

它使用辅助对象,你的任务是找出它是如何工作的。

答案 2 :(得分:0)

请记住,逗号是一个运算符。它计算每个表达式并返回右手操作数的值。此外,它从左到右关联。最后,>>的优先级高于,。这意味着

4, 1, 2, 3, 4 >> vX;

相当于

((((4, 1), 2), 3), (4 >> vX));

4, 1评估为1,因此以上评估为

(((1, 2), 3), (4 >> vX));

评估为

((2, 3), (4 >> vX));

评估为

(3, (4 >> vX));

评估为

4 >> vX;

因此,要编译上述语句,必须重载

Vex& operator>>(int, Vex&);

从评论到原始问题,教授似乎希望您为operator>>课程重载Vex。这意味着签名应为:

istream& operator>>(istream&, Vex&);

答案 3 :(得分:0)

你在想它。仔细阅读规范。我认为以下内容非常接近所要求的内容。

GCC 4.7.3:g ++ -Wall -Wextra -std = c ++ 0x

#include <vector>
#include <iostream>
#include <string>
#include <sstream>

template <class T>
struct Vex {
  std::vector<T> v;
};

template <class T>
std::istream& operator>>(std::istream& is, Vex<T>& vex) {
  auto dim = 0;
  is >> dim;
  for (auto i = 0; i < dim; ++i) {
    T t;
    is >> t;
    vex.v.push_back(t);
  }
  return is;
}

int main() {
  std::stringstream is("4 1 2 3 4");
  Vex<int> vex;
  is >> vex;

  for (auto i : vex.v) {
    std::cout << i << " ";
  }

  return 0;
}