我就需要有一個通用的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)甚至不會發出那我想投一個int
到unsigned long
含蓄警告,這絕對不是我想......
因此,在這種情況下, ,我將如何超載wrapper
類的運算符,以便在不需要時不需要創建臨時對象wrapper
?如果我刪除wrapper &operator+= (const unsigned long input)
超載,那麼我將不得不使用這樣的事情:
wrapper x(2);
x += wrapper(-2);
x += -2;//implicitly casts -2 to wrapper
,但我不認爲我可以依靠的事實,編譯器可能能夠優化掉多餘的對象..
我假設你正在用這兩個函數調用'const long'參數化版本。即使正在進行也可能沒有轉換。 – 2012-12-19 18:50:59
@EsaLakaniemi我不知道我明白你的意思...... –
哦,現在我正確地閱讀了這篇文章。編輯:哦,上帝,我只是應該停止回答問題我混在一起的答案和評論 – 2012-12-19 18:58:18