перегрузка операторов — пользовательский тип C ++

У меня есть класс int32и он настроен таким образом, что он может быть по существу связан с int (оператор перегружен), но есть одна часть, которую я не понимаю.

int32 i32 = 100; // Works
int i = 200; // Works
i32 += 10; // Works
i32 -= 10; // Works, i32 = 100 right now
i = i32; // Doesn't work

Какой оператор мне нужно было бы перегрузить, чтобы получить ссылку на i32, возвращающую его сохраненное значение, в данном случае 100 (или как еще это можно сделать)?

1

Решение

Вы можете добавить оператор преобразования operator int:

class int32 {
public:
operator int() const;
...
};

Обратите внимание, что он поставляется в двух вариантах. Вышеуказанное позволит

int32 foo;
int i = foo;

Если вы определяете оператор преобразования как explicit

    explicit operator int() const;

тогда вышесказанное не выполнится по проекту и потребует явного приведения:

int32 foo;
int i = static_cast<int>(foo);
6

Другие решения

class int32{
private:
std::int32_t value;
public:
constexpr /*explicit*/ operator std::int32_t() const noexcept { return this->value; }
};

Вам следует написать оператор преобразования.

int32 a = 1;
std::int32_t b = a;//OK

Тем не менее, это вредно, так что указать explicit и заставить бросить конвертировать.

int32 a = 1;
//std::int32_t b = a;//NG
std::int32_t b = static_cast<std::int32_t>(a);

примечание: вы не должны писать оператор преобразования в int, потому что нет гарантии int это 32 бита.

2

Реализуйте оператор преобразования в вашем классе int32.

class int32
{
// conversion operator
operator int() const
{
int ret = // your logic
return ret;
}
}

Этот оператор преобразования преобразует примитивный тип (int) в определенный вами тип int32;

0