Немного не связано, я думаю, вы должны переосмыслить ваш тип дизайна. Вы в основном говорите о двух разных типах здесь. Они хранят одни и те же данные, хотя и с разными результатами.
Чтобы свести к минимуму ошибки при их использовании, вы должны определить их как два совершенно разных типа, которые имеют четко определенное преобразование между ними.
Рассмотрим для примера:
struct old_time {
unsigned int timeInteger;
unsigned int timeFraction;
};
struct new_time {
public:
new_time(unsigned int ti, unsigned int tf) :
timeInteger(ti), timeFraction(tf) { }
new_time(new_time const& other) :
timeInteger(other.timeInteger),
timeFraction(other.timeFraction) { }
new_time(old_time const& other) :
timeInteger(other.timeInteger + 2209032000U),
timeFraction(other.timeFraction * conversion_factor) { }
operator old_time() const {
old_time other;
other.timeInteger = timeInteger - 2209032000U;
other.timeFraction = timeFraction / conversion_factor;
return other;
}
private:
unsigned int timeInteger;
unsigned int timeFraction;
};
(РЕДАКТИРОВАТЬ: конечно, этот код не работает по причинам, указанным ниже.
Теперь этот код можно безопасно использовать без трения:
time_old told; /* initialize … */
time_new tnew = told; // converts old to new format
time_old back = tnew; // … and back.