2016-08-12 101 views
1

我想重新定義位移運算符在一個64位無符號整數在C++中,我可以這樣說,x<<d,其中x是一個64位整數和d是一個整數與|d|<64,使其等效到x<<dd>0x>>|d|d<0重新定義已定義類型的單個運算符。 C++

我知道如何做到這一點的唯一方法是定義一個全新的類並重載運算符,但我認爲這也意味着我需要重載我需要的所有其他運算符(除非有一個技巧,我不知道),這看起來有點愚蠢,因爲我希望它們的行爲與預定義類型完全相同。這只是我想改變的偏移。目前,我剛剛寫了一個名爲'shift'的函數來做到這一點,儘管它工作正常,但它看起來並不是很好的C++ ish。

什麼是風格正確的方式來做我所需要的?

感謝

回答

5

如果你能做到這一點,那將是非常混亂,誰看了你的代碼,看看其他的C++程序員:

int64 x = 92134; 
int64 y = x >> 3; 

而且有它不同的表現比他們的預期,行爲與C++標準定義的行爲不同。

與我見過的C++代碼最相符的文體選擇是繼續使用自己的myshift()函數。

int64 y = myshift(x, 3); 
+0

「照'int's可以。「 –

0

我認爲這是非常可怕的(我建議只是爲了好玩),但是...如果你接受包裹位的數量在struct移...

#include <iostream> 

struct foo 
{ int num; }; 

long long int operator<< (const long long int & lli, const foo & f) 
{ 
    int d { f.num }; 

    if (d < 0) 
     d = -d; 

    if (d >= 64) 
     d = 0; 

    return lli << d; 
} 

int main() 
{ 
    long long int lli { 1 }; 

    std::cout << (lli << foo{+3}) << std::endl; // shift +3 
    std::cout << (lli << foo{-3}) << std::endl; // shift +3 (-3 -> +3) 
    std::cout << (lli << foo{+90}) << std::endl; // no shift (over 64) 
    std::cout << (lli << foo{-90}) << std::endl; // no shift (over 64) 

    return 0; 
}