我想在c ++中的64位无符号整数上重新定义位移运算符,我可以这样说,x<<d
,其中x
是64位整数,{{1 }}是一个带有d
的整数,使其等同于|d|<64
的{{1}}和x<<d
的{{1}}。
我知道如何做到这一点的唯一方法是定义一个全新的类并重载&lt;&lt;运算符,但我认为这也意味着我需要超载我需要的所有其他运算符(除非有一个我不知道的技巧),这看起来有点傻,因为我希望它们的行为与它们的行为完全相同预定义的类型。它只是我想要改变的位移。目前,我刚刚编写了一个名为“shift&#39;要做到这一点,即使它工作正常,它似乎也不是c ++ ish。
做出我需要的风格正确的方法是什么?
由于
答案 0 :(得分:5)
如果你能够做到这一点,那么阅读你的代码的其他C ++程序员会非常困惑:
int64 x = 92134;
int64 y = x >> 3;
它的行为与预期不同,行为与C ++标准定义的不同。
与我见过的C ++代码最相符的风格选择是继续使用你自己的myshift()函数。
int64 y = myshift(x, 3);
答案 1 :(得分: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;
}