【问题标题】:C++ redefine output stream of existing classC++重新定义现有类的输出流
【发布时间】:2017-12-04 12:23:48
【问题描述】:

我正在使用 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: 错误:'std::cout

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

【问题讨论】:

  • 如果对象已经定义了非成员函数,则不能重新定义它。
  • @Javia1492 我添加了一个编辑来解释为什么我认为它不是重复的
  • 这不行,你可以创建一个函数,做同样的事情,但是一旦定义了就不能重新定义了。

标签: c++ opencv iostream cout redefinition


【解决方案1】:

您不能用另一个重载替换一个重载。如果输出操作符有合适的钩子来改变输出是如何改变的,那么就有机会以这种方式修改输出。这个特定的输出运算符是否有这样的钩子我不知道。

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

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';

【讨论】:

    【解决方案2】:

    cv::Mat 已经有一个用户定义的operator&lt;&lt; 重载,您不能自己添加另一个重载,您必须更改重载或添加某种功能来满足您的要求,如只要它不是已经为该类定义的运算符。

    【讨论】:

      猜你喜欢
      • 2012-11-30
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多