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

标签 c++ opencv iostream cout redefinition

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

相关文章:

C++ String.h Char Tables 没有 strstr 的截断词

c++ - 作为函数参数的字符串对的 C++ vector 的默认规范在 gcc-4.1.2 上无效?

c++ - 数据结构的时间复杂度

opencv - 更多关于冲浪

opencv - 如何从单个 PNG 中分离两个大小为 8 和 16 的位图

c++ - 如何检测流中的 CRLF

c++ - OpenSSL 加密流

c++ - 使用结果启动异步操作

android - Android OpenCV-如何从后台服务处理相机帧?

c++ - ofstream 不在 C++ 中创建文件