2012-12-19 89 views
3

我就需要有一個通用的C++包裝的大數字圖書館,並在圖書館提供像這樣C風格的功能項目的工作:避免隱式轉換

//assignment 
lib_set(lib_type data, lib_type input); 
lib_set_si(lib_type data, long input); 
lib_set_ui(lib_type data, unsigned long input); 

//addition 
lib_add(lib_type data, lib_type input); 
lib_add_ui(lib_type data, unsigned long input); 

爲了避免創建臨時當它是不是真的有必要物品,我結束了這樣的事情:

class wrapper 
{ 
private: 
    lib_type data; 
public: 

    wrapper() 
    { 
     lib_set_ui(this->data, 0UL); 
    } 

    wrapper (const wrapper &input) 
    { 
     lib_set(this->data, input.data); 
    } 

    wrapper (const long input) 
    { 
     lib_set_si(this->data, input); 
    } 

    wrapper (const unsigned long input) 
    { 
     lib_set_ui(this->data, input); 
    } 

    wrapper &operator+= (const wrapper &input) 
    { 
     lib_add(this->data, input.data); 
     return *this; 
    } 

    wrapper &operator+= (const unsigned long input) 
    { 
     lib_add_ui(this->data, input); 
     return *this; 
    } 
}; 

不幸的是,如果我這樣做:

wrapper x(2); 
x += -2; 

編譯器(GCC/VS2010)甚至不會發出那我想投一個intunsigned long含蓄警告,這絕對不是我想......

因此,在這種情況下, ,我將如何超載wrapper類的運算符,以便在不需要時不需要創建臨時對象wrapper?如果我刪除wrapper &operator+= (const unsigned long input)超載,那麼我將不得不使用這樣的事情:

wrapper x(2); 
x += wrapper(-2); 
x += -2;//implicitly casts -2 to wrapper 

,但我不認爲我可以依靠的事實,編譯器可能能夠優化掉多餘的對象..

+0

我假設你正在用這兩個函數調用'const long'參數化版本。即使正在進行也可能沒有轉換。 – 2012-12-19 18:50:59

+0

@EsaLakaniemi我不知道我明白你的意思...... –

+0

哦,現在我正確地閱讀了這篇文章。編輯:哦,上帝​​,我只是應該停止回答問題我混在一起的答案和評論 – 2012-12-19 18:58:18

回答

3

我不知道如何描述隱藏轉換的方法。但是,您至少可以讓編譯器對其發出警告。

如果您在編譯時使用gnu Mingw/gcc,只需傳遞-Wconversion-Wsign-conversion。您現在應該在上面的代碼中收到警告。

對於MSVC,/Wall/W4應該會得到同樣的結果。

+0

用於'-Wsign-conversion'的+1。我幾乎可以確定它是由'-Wall'或'-Wextra'啓用的。你知道除了'-Wall -Wextra -Wconversion -Wsign-conversion'之外,我還應該向編譯器發送其他如此可愛的警告開關嗎?有沒有什麼辦法可以在Visual Studio中實現同樣的功能? –

+1

@MihaiTodor:默認情況下,Visual Studio會對符號轉換髮出警告。如果沒有,進入項目設置,並在那裏的某個地方,您可以將警告級別設置爲更高的級別。 (3默認我認爲) –

+0

@MooingDuck看來我必須去'/ W4',但是謝謝你指出這個!它確實有幫助。 –