Перегрузка операторов с ++ размещения - PullRequest
2 голосов
/ 25 мая 2011

У меня проблемы с выяснением, где разместить перегруженные операторы, которые я создал. они должны быть в классе, в котором они работают, или внутри? оба способа доставляют мне неприятности. любые указатели были бы хороши.

вот мой самый базовый класс 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. с другой стороны, перемещение всего наружу дает мне error: 'uint128_t operator=(uint128_t, T)' must be a nonstatic member function. Кроме того, оператор = не будет работать для постоянного ввода, по-видимому, так как значения будут ULLL, который не существует, если кто-то не знает способ сделать это.

что мне делать?

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Почему бы не сочетание обоих?Поставьте operator = внутри, а остальные снаружи.

Для тех, кто принимает uint128_t в качестве аргумента левой стороны, не имеет значения, если это аргумент правой стороны, то этоглобальная функция.По этой причине вы можете поместить обе функции рядом, если они глобальные.Вы можете даже сойти с умным макросом, чтобы иметь одну реализацию для обоих, если только для коммутативных.

0 голосов
/ 25 мая 2011

В общем случае лучше размещать их снаружи, так что для class X с неявным конструктором типа Y, единственная функция operator+(X&, const X&) позволяет добавлять X и Y ala x + y и y + x. Если вы видите способ и - и хотите - сделать x + y и / или y + x быстрее, чем x + x, тогда вам все равно могут потребоваться отдельные функции. Следует помнить одну вещь: часто хорошо иметь функцию-член operator+=, а затем реализовывать + с точки зрения возврата временной копии lhs (значение слева) после выполнения += правой части ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...