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

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

--快过

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

--问题

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

只有第一个值被传递给运算符...第二个值永远不会是 'used' 因为我相信 << 的总统比 ,

所以我的问题是他们在像 eigen 和 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 是重载逗号运算符的类型或辅助函数-returning-对象,并且您的 >> 需要能够采用该类型。否则 >> 的优先级将 "win" 并因此在看到逗号表达式之前被评估。

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