C++ 运算符重载 如何在 OpenCV 中实现像 Mat_ 的 CTOR 这样的模式<type>
c++ operator overloading how to implement the pattern like the ctor of Mat_<type> in opencv
在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,
以获取两个int
并以某种方式将它们捆绑在一起,那么不仅缺点更严重:当所有操作数都是内置类型时,重载运算符是非法的。
所以,总而言之:你可以这样做,但这是一个坏主意,会在代码的意外位置导致错误。
这是构建器模式与流畅接口的结合,使用插入器和逗号运算符作为简单的DSL。我看不到任何形式的危险(如果做得好的话),因为DSL定义了一个非常特殊的上下文,这些操作符适用于其中。如果你正在寻找灵感,可以看看boost::assign。无论如何,我会使用口头DSL元素而不是运算符,但这只是我个人的喜好。。。
- std::is_base_of表示ctor编译错误
- EASTL矢量<向量<int>>连续的
- 对复制 CTOR 和 CTOR 的未定义引用
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- C++成功复制动态分配的 obj 而不复制 ctor?
- 如何测试采用 std::initializer_list 的 ctor 具有编译时已知长度?
- 为什么 std::optional::value_or 没有默认 ctor 类型的专用化?
- 在CTOR vs Connect方法中提升套接字与stream_socket端点
- 给定一个右值,为什么移动ctor比常量复制ctor更匹配
- std::任何只用于移动的模板,其中副本ctor内的static_assert等于编译错误,但为什么
- C2436 '{ctor}':构造函数初始值设定项列表中的成员函数或嵌套类
- 为什么在 ctor 的参数列表中将成员"x"的类型替换为"decltype(x)"会破坏类模板参数推导?
- 模板 ctor 类型推导不起作用(没有匹配的构造函数用于初始化 ...)与函数<>参数
- 为什么"non-standard syntax; use '&' to create a pointer to member"在 CTOR 中使用线程?
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 调用了Copy ctor而不是move ctor
- 委派的 ctor 是否受参数计算顺序的影响?
- 由于 C++17 支持数组shared_ptr,这是否意味着在 ctor 和重置中不再需要 T[] 的显式删除器?
- 为什么部分初始化一个类然后调用委托 ctor 失败?
- 返回函数中带有 2 个可选 ctor 的对象