2016-02-17 38 views
1

我寫一些C++代碼,需要測試的字符串和字符平等,爲簡單起見,我想考慮正破折號( 0x96)和m-dash(0x97)字符相同。C++如何調用操作的標準形式從重載運算符中

我的第一反應是重新定義平等運營商,並開始代碼,但後來遇到了一個問題:

inline bool operator==(char lhs, char rhs) { 
    if (lhs == 0x96 && rhs == 0x97) return true; // works fine 
    else if (lhs == 0x97 && rhs == 0x96) return true; // works fine 
    else return lhs == rhs; // infinite recursion... 
} 

在該函數的最後一行,最好我想能夠調用相等運算符的「舊」形式,類似於派生類如何能夠調用基類的函數版本。

我想知道這是否可能在C++?如果沒有,我假設我應該將上面的代碼提取到一個單獨的函數中,然後調用該函數而不是使用運算符。

回答

2

你不行。一旦你超載一個運營商,你的取代默認的一個。 (有一個有趣的例外:即std::addressof可用於規避超載的&運營商)。

我不得不對超載operator==(char, char)強烈的保留意見:你會打破了很多的代碼。

如果你真的必須雖然做到這一點,你總是可以寫(int)lhs == rhs;這將導致轉換都運營商int所以阻斷遞歸。由於intchar的超集,因此將始終進行定義。奇怪的是,這就是爲什麼你之前的兩個比較工作的原因:隱式轉換char正在發生,這會阻止函數調用它自己。

+0

有道理,所以你建議定義一個單獨的功能,並只在我需要它的具體地方使用它? –

+1

絕對如此。編寫你自己的稱爲'funnyEquals(char,char)'的函數。 – Bathsheba

+1

我不認爲標準C++允許爲內置插件重載運算符。 – juanchopanza

1

首先,從來沒有試圖在內建類型純粹的重載運算符...使用,而不是一個函數...

你的第一個比較報表的工作,因爲type promotion

char將被轉換爲int並進行比較...最後一個呼叫您的運營商再次

+0

你的第二個陳述是一個好地方,加上一個。 – Bathsheba