在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/