运算符重载c ++放置

问题描述

| 我在弄清楚我创建的重载运算符的放置位置时遇到麻烦。他们应该在他们所经营的班级中还是内部?两种方式都给我带来麻烦。任何指针都很棒。 这是我非常基本的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 \的ala
x + y
y + x
。如果您能找到一种方法-并希望-使
x + y
和/或
y + x
x + x
更快,那么您可能仍需要单独的功能。要记住的一件事:通常最好有一个
operator+=
成员函数然后实现
+
,这是在对rhs进行
+=
之后返回lhs的临时副本(左侧值)。 。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...