[英]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元素而不是運營商,但這僅僅是我個人的偏好......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.