繁体   English   中英

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

[英]How to overload >> operator to take a comma separated variable argument list

-快速之前

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

- 题

我正在尝试重载>>运算符,以便能够将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;

只有第一个值传递给...第二个值永远不会“拿来主义”的运营商,因为我相信<<比更高的遵,

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

在此先感谢您的任何建议。

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

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)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM