c++ - 如何重载 >> 运算符以获取逗号分隔的变量参数列表
问题描述
--快速之前
所以在有人说这个问题已经在另一个帖子上得到回答之前,它还没有......这是另一个帖子中的一个家庭作业问题,原来的问题从未得到回答,只是告诉他们错了。
- 问题
我正在尝试重载 >> 运算符,以便能够将由逗号分隔的 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++ 工作原理,我希望这里有人可以对此有所了解。
提前感谢您的任何建议。
解决方案
您必须重载插入运算符 ( <<
) 和逗号运算符 ( ,
),这样
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)
推荐阅读
- amazon-web-services - CodePipeline 有条件地跳过管道中的操作,而不会导致管道失败
- javascript - 将矩阵转换为按列的新平面数组
- android - Metro 服务器向本地节点快速应用程序发布请求,通过 USB 连接手机
- bokeh - 散景:通过 JS 回调将 onclick 事件强制为图例
- android - Jetpack Compose - 点击坐标与矩形坐标不匹配
- react-native - 不显示音轨和播放/暂停的音频背景模式控件不适用于 react-native-track-player
- r - 如何在服务器上从 github 安装包?
- windows - 通过 Chef 运行 Powershell 脚本 - 转义字符语法无效
- git - 为什么我使用 git mirror 命令时会出错?
- angular - 基于组件输入动态显示组件