首页 > 解决方案 > 如何重载 >> 运算符以获取逗号分隔的变量参数列表

问题描述

--快速之前

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

- 问题

我正在尝试重载 >> 运算符,以便能够将由逗号分隔的 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++ 工作原理,我希望这里有人可以对此有所了解。

提前感谢您的任何建议。

标签: c++overloadingeigenoperator-keywordistream

解决方案


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

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)

推荐阅读