好吧,它可能是從我在這個線程,這是一個特別的痛處,我一切的評論明顯不夠。這是有原因的,我曾經像你一樣。我喜歡,我可以重載操作員!驚人!過載所有操作員(這是與一個自定義圖像容器類型)。過了一段時間,一些事情變得清晰:
- 運營商很難正確申報,尤其是模板化的申報者。
- 模板運算符不能明確地設置它們的類型,只能隱式地設置。
- 操作順序一直沒有意義。
- 運算符必須使用異常作爲它們在所有情況下都不理想的「失敗」模式,或者如果可以在編譯時檢測到失敗,則使用「enable-if」類型語法。
- 運算符意義很難記錄/闡明。對運營商應該「做什麼」的不同解釋使得很難弄清楚。 (
MyArray<T>+MyArray<J>
是否應該像T+J
那樣工作,或者應該像'串+字符串'一樣工作?)
- 運算符必須按值返回,如果您的移動沒有正確設置,則會導致開銷/你不在C++ 11 /出於任何原因返回值elision不會發生。
- 總的來說,編寫自己的容器類型是重做STL已經完成的大量工作的好方法。
,你可以不喜歡它(在命名空間範圍)(假設你有一個模板轉換運算符)
template <typename T, typename J>
MyArray<decltype(T()+J())> operator+(const MyArray<T>& x,const MyArray<J>& y)
{
using K=decltype(T()+J());
MyArray<K> ret(x.size());//or something?
for (size_t i = 0; i < x.size(); i++) {ret[i]=x[i]+y[i];}//could replace with foreach
return ret;
};
雖然使用與載體以下只是更有意義。如果需要,您可以將其封裝在「添加」電話中。
std::vector<T> a;//or whatever
std::vector<J> b;//or whatever
std::vector<K> c(a.size());//note: you can still use the decl type here, OR just define it to whatever you actually want it to be
std::transform(a.begin(), a.end(). b.begin(), c.begin(), std::plus<K>());
如果你正在嘗試做這一切的地方,並試圖使矩陣數學庫,使用一個像徵,它會爲您節省了大量的工作,這將是強類型作爲一個矩陣,而不是一個通用的集合,它將完成與Eigen團隊的全部數學知識。
這些操作員需要做什麼?如果它們是簡單的算術,那麼你爲什麼必須自己寫它們? – ZivS
這可能是一個實例,運算符重載不是一個好的選擇,恕我直言。 'std :: transform(this-> begin(),this-> end(),addend.end(),output-> begin(),std :: plus());' –
IdeaHat
爲了擴展,二元運算符重載只有當你能保證他們有意義時纔有意義。這看起來很簡單,但你需要保證像'a + b == b + a'這樣的東西,你的情況顯然不會(返回類型不一致)。另外,看起來你正在爲每個運算符分配一個新的數組,這將產生不必要的開銷。 – IdeaHat