簡體   English   中英

c ++運算符重載如何實現模式,如mat_的ctor <type> 在opencv中

[英]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元素而不是運營商,但這僅僅是我個人的偏好......

C ++ &lt;

[英]C++ <<operator overloading with same type

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM