gpt4 book ai didi

C++重新定义现有类的输出流

转载 作者:太空宇宙 更新时间:2023-11-03 22:09:36 26 4
gpt4 key购买 nike

我正在使用 OpenCV,但我不喜欢以下输出:

std::cout << matrix << std::endl;当矩阵的类型为 cv::Mat .

是否可以重新定义运算符<<的效果在现有类的对象上,而不必修改类的代码?

我知道我可以编写一个简单的函数来从 cv::Mat 中生成一个字符串但结果会不太可读(我认为),而且我是 C++ 的初学者,所以我可能错过了一些东西。

我找到了 this SO question所以我尝试了:

#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>

std::ostream& operator<<(std::ostream& os, const cv::Mat& mat)
{
os << "test";
return os;
}

int main(int argc, char** argv)
{
cv::Mat m(2,2, CV_8UC3, cv::Scalar(0,0,255));
std::cout << m << std::endl;
}

但是我得到了:

main.cpp:14:18: error: ambiguous overload for ‘operator<<’ in ‘std::cout << m’

编辑:我不认为它是 this question 的拷贝因为我无权访问库的代码(OpenCV 是开源的,所以理论上我可以修改它,但那将是一个坏主意:更难维护、重新分发我的代码等)。

最佳答案

您不能用另一个重载替换一个重载。如果输出运算符有合适的钩子(Hook)来改变输出的变化方式,则可能有机会以这种方式修改输出。我不知道这个特定的输出运算符是否有这样的钩子(Hook)。

合理可读的解决方法是创建一个简单的包装器:

struct MatFormatter {
cv::Mat const& mat;
};
std::ostream& operator<< (std::ostream& out, MatFormatter const& formatter) {
// format formatter.mat to your liking
}
MatFormatter format(cv::Mat const& mat) {
return MatFormatter{mat};
}
// ...
out << format(mat) << '\n';

关于C++重新定义现有类的输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44848200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com