问题描述
|
我在弄清楚我创建的重载运算符的放置位置时遇到麻烦。他们应该在他们所经营的班级中还是内部?两种方式都给我带来麻烦。任何指针都很棒。
这是我非常基本的uint128_t类:
class uint128_t{
private:
uint64_t UPPER,LOWER;
public:
// constructors
uint128_t(){
UPPER = 0;
LOWER = 0;
}
template <typename T>
uint128_t(T val){
UPPER = 0;
LOWER = (uint64_t) val;
}
template <typename S,typename T>
uint128_t(const S & upper_val,const T & lower_val){
UPPER = (uint64_t) upper_val;
LOWER = (uint64_t) lower_val;
}
uint128_t(uint128_t val){
UPPER = val.upper();
LOWER = val.lower();
}
uint64_t upper(){
return UPPER;
}
uint64_t lower(){
return LOWER;
}
};
如果操作员在课堂上,他们工作会很好。但是,我可以做uint128_t ^ uint32_t
,但不能做uint32_t ^ uint128_t
。另一方面,把所有东西都搬出去给我3英镑。同样,operator =显然不会对恒定输入起作用,因为值将是ULLL,除非有人知道这样做的方法,否则该值将不存在。
我该怎么办?
解决方法
为什么不将两者混合?
将operator =放在里面,其余放在外面。
对于那些以uint128_t作为左手参数的人来说,没关系,如果它是右手参数,那么它必须是一个全局函数。因此,如果这两个函数是全局的,则可以将它们并排放置。您甚至可能会避开一个聪明的宏,即使仅对交换宏,也可以为这两个实现一个实现。
,通常,最好将它们放在外面,以便对于带有类型
Y
的隐式构造函数的class X
,单个函数operator+(X&,const X&)
允许您添加X \和Y \的alax + y
和y + x
。如果您能找到一种方法-并希望-使x + y
和/或y + x
比x + x
更快,那么您可能仍需要单独的功能。要记住的一件事:通常最好有一个operator+=
成员函数然后实现+
,这是在对rhs进行+=
之后返回lhs的临时副本(左侧值)。 。