我的任務是遷移C++類庫中錯誤處理的概念。先前簡單地返回bool(成功/失敗)的方法將被修改爲返回一個表達機器可讀錯誤代碼和人類可讀解釋(以及其他在此不重要)的對象。C++:我可以讓一個賦值運算符「顯式」嗎
遍及數千行代碼是容易出錯的,因此我嘗試從編譯器獲得此任務的最佳支持。
我的結果類具有 - 其他成員方法中 - 即構建從代碼和代碼中的賦值運算符結果的構造:
class Result
{
public:
typedef unsigned long ResultCode;
explicit Result(ResultCode code); // (1)
Result& operator=(ResultCode code); // (2)
};
備註:我通常會用一個枚舉類ResultCode
這會解決我的問題,但這不是一種選擇。這是因爲主要設計目標是在不同的庫中使用Result
,每個庫都應定義自己的一組結果代碼,而不需要一個大的頭文件來定義所有庫的所有可能的結果代碼。實際上,每個類應能夠定義本地結果代碼,以便可以從類頭獲得可能的結果代碼列表。因此代碼不能枚舉在Result
中,它們必須由類使用Result
類定義。
爲了避免在客戶端代碼
return true;
聲明隱式轉換,構造已被宣佈明確的。但是在嵌套方法調用中,會發生另一個問題。我說,我有一個方法
bool doSomething()
{
return true;
}
裏面我是用在返回Result
對象的函數。我要轉發嵌套調用
Result doSomethingElse
{
Result result = doSomething();
return result;
}
當前實現Result
的賦值操作符的結果代碼,這不會給我一個編譯器錯誤 - DoSomething的的布爾返回值()是隱式轉換爲無符號長整數。
正如我在C++文檔中所讀到的,只有構造函數和轉換運算符可能被聲明爲顯式。
我的問題
- 爲什麼明確不允許賦值運算符或其他方法?國際海事組織(IMO)會允許任何方法都是明確的,這也是很有道理的。
- 是否有其他解決方案來防止賦值運算符的隱式類型轉換?
我知道這是不是你想要的答案,但爲什麼不使用C++中的異常處理機制?不要反對這種語言。與它一起工作。 (加上一個很好的問題,雖然)。 – Bathsheba
難道你不能聲明'template void operator =(T)= delete;'並保留你擁有的那個。它將在正常情況下使用該方法,並嘗試對所有其他類型使用刪除的方法。 –
doug65536
我不知道是否有可能甚至是鼓勵,但你可能擴展[系統錯誤類](http://en.cppreference.com/w/cpp/error#System_error)而不是自己完成? –