On Wednesday, 30 January 2013 at 19:44:43 UTC, TommiT wrote:
[..]
More of fleshing out of namespace_thingy: struct S { private: int m_startTime; int m_endTime; int m_duration; public: namespace_thingy start { int opGet() const { return m_startTime; } start opAssign(int t) { m_startTime = t; m_duration = m_endTime - m_startTime; return start; } } namespace_thingy end { int opGet() const { return m_endTime; } end opAssign(int t) { m_endTime = t; m_duration = m_endTime - m_startTime; return end; } dur opAssign(string s : "+")(int t) { m_endTime += t; m_duration = m_endTime - m_startTime; return dur; } } namespace_thingy dur { dur opAssign(int t) { m_duration = t; m_endTime = m_startTime + m_duration; return dur; } bool opEquals(int t) const { return m_duration == t; } } this(int t) { start = 0; end = t; assert(dur == 100); } } ... S s; s.start = 1; s.end = 8; assert(s.dur == 7); s.end += 3; assert(s.dur == 10); int v = s.start; s.start += 42; // error: no match for opAssign!"+"(S.start, int) // nor opAssign!"+"(int, int) int d = s.dur; // error: no conversion from S.dur to int