У меня есть класс 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 (или как еще это можно сделать)?
Вы можете добавить оператор преобразования 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);
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 бита.
Реализуйте оператор преобразования в вашем классе int32.
class int32
{
// conversion operator
operator int() const
{
int ret = // your logic
return ret;
}
}
Этот оператор преобразования преобразует примитивный тип (int) в определенный вами тип int32;