-快速入门
所以在有人说这个问题已经在另一篇文章中得到回答之前,它还没有...这是另一篇文章中的一项家庭作业问题,原始问题从未得到回答,只是告诉他们错了。
-问题
我正在尝试重载>>运算符,以便能够将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 ++的工作方式,而我希望这里的人可以对此有所了解。
预先感谢您的任何建议。
答案 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是类型或辅助函数返回对象,从而使逗号运算符超载,并且>>必须能够采用该类型。否则>>的优先级将“获胜”,因此在看到逗号表达式之前先对其求值。
一个更丑陋的选择是让>>返回一个重载运算符,()的类型,但我相信第一个更可取(实际上,我会说整个方案都不可取)。