我正在使用 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/