Перегрузочный оператор присваивания для вывода типа

Вот код ideone: http://ideone.com/Qp8Eqg

У меня вопрос, возможно ли форсировать конвертацию только на основе lvalue? Например,

[Seconds] s = 2_h + 60_s;
cout <<s.getSeconds()<<endl;

Очевидно, я должен был бы написать что-то вроде 2_h.toSeconds (), но это было бы слишком многословно и не достигло этой идеи.

1

Решение

Чтобы разрешить это (что, скорее, ваш вопрос, чем то, что вы написали, поправьте меня, если я ошибаюсь):

Seconds s = 2_h;

следующее будет работать: Добавить operator Seconds() const к классу Hours:

class Hours {
unsigned long long _hours;
public:
Hours(unsigned long long hours) : _hours(hours) { }

operator Seconds() const;

unsigned long long getHours() const {
return this->_hours;
}
};

и определить это после учебный класс Seconds:

Hours::operator Seconds() const { return this->_hours * 3600; }
3

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

Как уже отмечалось в ответе, вам необходимо иметь operator Seconds () реализован для автоматического преобразования из Hours в Seconds, С этим оператором на месте вы также можете упростить operator+, И чтобы улучшить время выполнения вы также можете добавить некоторые constexpr чтобы значения оценивались во время компиляции.

#include <iostream>

class Seconds {
public:
constexpr Seconds(const Seconds& other) : seconds_(other.seconds_) {}
constexpr Seconds(unsigned long long seconds) : seconds_(seconds) {}

Seconds& operator=(const Seconds& other) {
seconds_  = other.seconds_;
return *this;
}

constexpr unsigned long long value() const {
return this->seconds_;
}

private:
unsigned long long seconds_;
};class Hours {
public:
constexpr Hours(const Hours& other) : hours_(other.hours_) {}
constexpr Hours(unsigned long long hours) : hours_(hours) {}

Hours& operator=(const Hours& other) {
hours_ = other.hours_;
return *this;
}

unsigned long long value() const {
return this->hours_;
}

operator Seconds () const { return Seconds(hours_*60*60); }
private:
unsigned long long hours_;
};constexpr Seconds operator+(const Seconds& lhs, const Seconds& rhs)
{
return Seconds(lhs.value()+rhs.value());
}

constexpr Hours operator "" _h(unsigned long long hours) {
return Hours(hours);
}

constexpr Seconds operator "" _s(unsigned long long seconds) {
return Seconds(seconds);
}int main() {
using namespace std;

Seconds s = 1_h + 10_s;
cout <<s.value()<<endl;
s = 2_h + 60_s;
cout <<s.value()<<endl;
return 0;
}
1

По вопросам рекламы [email protected]