重新定义已定义类型的单个运算符。 C++
问题描述:
我想重新定义位移运算符在一个64位无符号整数在C++中,我可以这样说,x<<d
,其中x
是一个64位整数和d
是一个整数与|d|<64
,使其等效到x<<d
的d>0
和x>>|d|
的d<0
。重新定义已定义类型的单个运算符。 C++
我知道如何做到这一点的唯一方法是定义一个全新的类并重载运算符,但我认为这也意味着我需要重载我需要的所有其他运算符(除非有一个技巧,我不知道),这看起来有点愚蠢,因为我希望它们的行为与预定义类型完全相同。这只是我想改变的偏移。目前,我刚刚写了一个名为'shift'的函数来做到这一点,尽管它工作正常,但它看起来并不是很好的C++ ish。
什么是风格正确的方式来做我所需要的?
感谢
答
如果你能做到这一点,那将是非常混乱,谁看了你的代码,看看其他的C++程序员:
int64 x = 92134;
int64 y = x >> 3;
而且有它不同的表现比他们的预期,行为与C++标准定义的行为不同。
与我见过的C++代码最相符的文体选择是继续使用自己的myshift()函数。
int64 y = myshift(x, 3);
答
我认为这是非常可怕的(我建议只是为了好玩),但是...如果你接受包裹位的数量在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;
}
“照'int's可以。“ –