Я предложу еще раз: использовать наследование .
Сейчас ваша проблема заключается в использовании псевдонимов типов через using
.Это не создает новые типы, только новые имена для старых типов.Вы пытаетесь дважды перегрузить одним и тем же типом, что бессмысленно и невозможно, поскольку перегрузка не заботится о новых именах.
Но наследование создает типы .Это его работа;это его цель.
С этим вы можете легко сделать то, что иногда называют «сильным определением типа» - свежий, отличный тип, который в остальном ведет себя почти так же, как то, что вы получаете.
Это требует небольшого количества гимнастики, но конечный результат довольно сексуален, и может быть тривиально улучшен с другой получасовой работой.(Например, небольшая семантика перемещения в этом повышающем преобразовании ctor, вероятно, не помешала бы…))
Итак, ладно, вам нужно потратить несколько строк на настройку типов.И, ладно, вам нужно немного расширить вызов duration_cast
.
Но, честно говоря, это небольшая цена, которую нужно заплатить, чтобы получить решение, не основанное на хакерстве!
(На самом деле вам нужно только применить это к blee
, но я сделал это для симметрии. Лучше или хуже, чем оставить tick
, так как псевдоним простого типа зависит от читателя.)
Я бы даже сказал, что это единственное семантически «правильное» решение, потому что вы действительно создаете семантически новые типы, а не псевдоним для этого.Псевдоним предназначен для создания удобного альтернативного имени некоторому существующему типу.