2016-08-01 25 views
1

我有代碼,我可以查詢std::set類型爲A的所有符合條件的結構。我經常希望我的查詢條件是這樣,代碼返回一個只包含一個對象的集合。在這些情況下,如果查詢沒有產生一個結果,我會希望我的代碼失敗。所以,我想提出一個功能間接運算符的定義質量是什麼?

A& deref_or_throw(std::set<A> s) 
{ if (s.size() != 1) throw ...; return *s.begin(); } 

拋出,如果集包含多個(或沒有)元素,否則取消引用的第一個元素。

爲了簡便起見,我還以爲重載間接運算符,這是不是std::set定義:

A& operator*(std::set<A>& s) {return deref_or_throw(s);} 

這是一個壞主意?它符合間接運算符的概念,它執行解引用。但是我無法根據標準找到間接操作符應該做什麼的嚴格定義,以確定我是否扭曲了它的標準使用(太遠)。

+5

對我來說這沒有意義。 '*'表示給我指向的對象。我討厭使用不同的操作符,然後在標準類型上做什麼。 – NathanOliver

+0

@NathanOliver:所以你不應該使用運算符'<<'來插入對象到流,因爲這是最初的按位左移運算符... – shrike

+2

@shrike你最初的意思是什麼?當C++在98年被標準化時,它既是篩選器又是流操作器。他們是否應該成立一個新的運營商,idk。現在是否遲到要改變它,是的 – NathanOliver

回答

2

請勿以這種方式重載operator*。一個人的簡潔是另一個人的混淆。

在這種情況下,operator*在任何標準容器上都沒有任何先例,所以如果任何人查看代碼,他們將不知道它的作用,而不會發現operator*的實現。相反,現在多花10秒鐘的時間來複制粘貼你的函數調用名稱,並保存你的未來維護者,他們知道從現在開始,一年中搜索操作符的過載時間有多長。

我會建議可能類似*ensure_single_element(your_set).begin()或其中很清楚發生了什麼事情。

+0

這不回答這個問題... – ciamej

+1

我看到的OP問題是「這是一個壞主意嗎?」。對我來說,這個答案說,是的,並且提出了一個合適的選擇,以及爲什麼(即可讀性)。 –

+0

我把一個「不,不要這樣做」的主句,留下原有的推理。 –