c++ - 运算符重载 C++ 放置

标签 c++ operator-overloading

我无法弄清楚在哪里放置我创建的重载运算符。他们应该在他们操作的类(class)里,还是在里面?这两种方式都给我带来了麻烦。任何指针都会很棒。

这是我最基本的 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;
        }
};

如果运算符(operator)在类里面,他们工作正常。但是,我可以执行 uint128_t ^ uint32_t 但不能执行 uint32_t ^ uint128_t。另一方面,将所有内容移到外面会给我 error: 'uint128_t operator=(uint128_t, T)' must be a nonstatic member function。此外,operator= 显然不适用于常量输入,因为值将是 ULLL,它不存在,除非有人知道这样做的方法。

我该怎么办?

最佳答案

为什么不把两者结合起来呢? 将 operator= 放在里面,其余的放在外面。

对于将 uint128_t 作为左侧参数的那些,没关系,如果它是右侧参数,那么它必须是全局函数。因此,出于这个原因,如果它们是全局的,您可以将这两个函数并排放置。如果仅针对可交换的宏,您甚至可以使用一个聪明的宏来实现两者的一个实现。

关于c++ - 运算符重载 C++ 放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6119306/

相关文章:

c++ - 在 Linux 上,命令行程序 mktemp 是否不如 C 函数 mkstemp 安全?

c++ - 关于重构的书的建议?

c++运算符重载,

c++ - 复合取消引用和赋值的运算符重载

C++ - ostream (<<) 重载

c++ - 如何使用 type_traits 仅在特定类型上添加模板类的成员函数 | C++

c++ - 如何忽略文件底部的空格?

c++ - 调整 QGraphicsScene 大小时的事件

c++ - 使用类特定的 set_new_handler

groovy - 重载 Groovy 比较运算符的问题