【问题标题】:How to overload >> operator to take a comma separated variable argument list如何重载 >> 运算符以获取逗号分隔的变量参数列表
【发布时间】:2018-10-17 22:14:43
【问题描述】:

--快速之前

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

--问题

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

只有第一个值被传递给操作员...第二个值永远不会被“使用”,因为我相信&lt;&lt;, 具有更高的优先级

所以我的问题是他们在 eigen 和 openCV 等库中做了什么才能拥有此功能。我查看了他们的代码以试图理解它,但它似乎需要更深入地了解 C++ 的工作原理,而我没有,我希望这里有人能对此有所了解。

提前感谢您的任何建议。

【问题讨论】:

  • 你可以使用初始化列表吗? (即我们可以把所有的数字都放在{}大括号内)object &lt;&lt; { 1,2,3,4,5,6,7,8};
  • @MartinYork 虽然这很好,但似乎不可能如这里解释的那样。 stackoverflow.com/questions/11420448/…

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


【解决方案1】:

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

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)

【讨论】:

    【解决方案2】:

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

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

    这将要求 some_temporary 是重载逗号运算符的类型或辅助函数返回对象,并且您的 >> 需要能够采用该类型。否则,>> 的优先级将“获胜”,因此在看到逗号表达式之前进行评估。

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

    【讨论】:

    • 所以我觉得这是正确的......但是看起来 eigen 的人已经找到了一个解决方法,可以在后台执行“Some_Temporary”,而我并不完全了解如何。
    • 大括号() 内的结果只是逗号运算符的结果。最后一个元素作为表达式的结果返回。
    猜你喜欢
    • 2011-01-24
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2023-03-05
    相关资源
    最近更新 更多