重新定义已定义类型的单个运算符。 C ++

时间:2016-08-12 21:40:36

标签: c++11 operator-overloading operators

我想在c ++中的64位无符号整数上重新定义位移运算符,我可以这样说,x<<d,其中x是64位整数,{{1 }}是一个带有d的整数,使其等同于|d|<64的{​​{1}}和x<<d的{​​{1}}。

我知道如何做到这一点的唯一方法是定义一个全新的类并重载&lt;&lt;运算符,但我认为这也意味着我需要超载我需要的所有其他运算符(除非有一个我不知道的技巧),这看起来有点傻,因为我希望它们的行为与它们的行为完全相同预定义的类型。它只是我想要改变的位移。目前,我刚刚编写了一个名为“shift&#39;要做到这一点,即使它工作正常,它似乎也不是c ++ ish。

做出我需要的风格正确的方法是什么?

由于

2 个答案:

答案 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;
 }