Вот код ideone: http://ideone.com/Qp8Eqg
У меня вопрос, возможно ли форсировать конвертацию только на основе lvalue? Например,
[Seconds] s = 2_h + 60_s;
cout <<s.getSeconds()<<endl;
Очевидно, я должен был бы написать что-то вроде 2_h.toSeconds (), но это было бы слишком многословно и не достигло этой идеи.
Чтобы разрешить это (что, скорее, ваш вопрос, чем то, что вы написали, поправьте меня, если я ошибаюсь):
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; }
Как уже отмечалось в ответе, вам необходимо иметь 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;
}