在opencv中,我可以像这样构造Mat的对象:

Mat mat = (Mat_<int>(2, 3) << 1, 2, 3, 4, 5, 6);

因此,初始化Mat_<type>实例很方便,如果我有一个自定义的简化矩阵类Mat2D,我将在其中使用此模式,但怎么办?
更新:我尝试使用可变长度参数列表,但使用error C2829: 'operator <<' cannot have a variable parameter list

最佳答案

警告:请勿这样做。你被警告了。

您可以使用运算符重载来实现此目的,但这是一个非常糟糕的主意,正如我稍后将解释的那样。

我假设Mat类具有一个采用Mat_<int>的构造函数。

我假设类模板Mat_<T>具有方法Insert(),该方法知道如何将单个元素插入矩阵。我让您解决这个问题,但是它需要一种方法来知道将其插入到哪里。

使用此方法很容易重载operator<<:

template<typename T>
Mat_<T>& operator<<(Mat_<T>& mat, const T& el)
{
  mat.Insert(el);
  return mat;
}

我们可以重载operator,来调用此重载的operator<<:
template<typename T>
Mat_<T>& operator,(Mat_<T>& mat, const T& el)
{
  return mat << el;
}

一切正常,您可以使用语法。现在,我将解释为什么这是一个坏主意。

以这种方式重载operator<<是完全明智的。这是插入运算符,我们的重载将元素插入矩阵。这是任何人所期望的;到现在为止还挺好。

但是重载operator,并不是。该运算符的含义是“求两个表达式,然后返回最后一个表达式”;这显然不是我们的重载运算符所做的。粗心的用户将尝试以标准方式(例如,在,循环中)使用运算符for,并且将不理解为什么他们的代码不起作用。除非您想被使用代码的人所讨厌,否则绝对不要让运算符(operator)重载执行非标准操作。可能以后你自己。

实际上,尽管标准允许重载operator,,但是您可能永远不应该这样做,因为不可能编写执行标准操作的代码。您可以认为这是为保持向后兼容性而保留的标准中的错误。

而且,如果您考虑重载operator,以获取两个int并以某种方式将它们 bundle 在一起,则不仅弊端更加严重:当所有操作数都是内置类型时,重载运算符是非法的。

因此,总而言之:您可以做到,但这不是一个好主意,并且会在代码的意外位置引起错误。

关于c++ - c++运算符重载如何在opencv中实现类似于Mat_ <type>的ctor的模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12692600/

10-15 05:56