如何重载>>运算符以逗号分隔的变量参数列表

时间:2018-10-17 22:14:44

标签: c++ overloading eigen operator-keyword istream

-快速入门

所以在有人说这个问题已经在另一篇文章中得到回答之前,它还没有...这是另一篇文章中的一项家庭作业问题,原始问题从未得到回答,只是告诉他们错了。

-问题

我正在尝试重载>>运算符,以便能够将n个由逗号分隔的变量传递给这样的对象...

Mat M = (Mat_<double>(3,3) << 1, 0, 0, 0, 1, 0, 0, 0, 1);

我试图重用他们使用逗号分隔的参数列表,但是我似乎无法使其正常工作。

当我像这样重载<<操作符

void operator<< (const double& is)
{
    std::cout << "hiya " << is << std::endl;
}

并尝试像这样使用它

mat << 1.0, 2.0;

仅将第一个值传递给运算符...第二个值从不“使用”,因为我相信<<的存在比,

所以我的问题是,他们在诸如eigen和openCV之类的库中正在做什么才能具有此功能。我浏览了他们的代码以尝试理解它,但似乎需要更深入地了解C ++的工作方式,而我希望这里的人可以对此有所了解。

预先感谢您的任何建议。

2 个答案:

答案 0 :(得分:4)

您必须使插入运算符(<<)和逗号运算符(,)重载,以使

mat << 1.0, 2.0;

被翻译为:

mat.operator<<(1.0).operator,(2.0);

operator,(operator<<(mat, 1.0), 2.0);

这是一个演示程序,它在没有做任何有用的事情的情况下说明了这个想法。

struct Foo
{
};

Foo& operator<<(Foo& f, double)
{
  std::cout << "In operator<<(Foo& f, double)\n";
   return f;
}

Foo& operator,(Foo& f, double)
{
   std::cout << "In operator,(Foo& f, double)\n";
   return f;
}

int main()
{
   Foo f;
   f << 10, 20, 30;
}

及其输出

In operator<<(Foo& f, double)
In operator,(Foo& f, double)
In operator,(Foo& f, double)

答案 1 :(得分:1)

您必须从第一个参数创建一个临时变量,并用括号将整个逗号列表括起来:

myObj >> (some_temporary(3), 1, ...);

,这将要求some_temporary是类型或辅助函数返回对象,从而使逗号运算符超载,并且>>必须能够采用该类型。否则>>的优先级将“获胜”,因此在看到逗号表达式之前先对其求值。

一个更丑陋的选择是让>>返回一个重载运算符,()的类型,但我相信第一个更可取(实际上,我会说整个方案都不可取)。