Sergey Alexandrovich Kryukov
К сожалению, вы не наследуете примитивный тип, а пишете обертку вокруг него.
Я только столкнулся с истинным наследованием примитивных типов в языке Ada, и этот подход блестящ! (Существуют различные объявления типа и подтипа; с типами неявное преобразование не компилируется.)
Возвращаясь к C++ и вашей оболочке, вам действительно нужно объединить все арифметические операции между оболочками, а также между оболочками и примитивным числовым типом. (Это вы упомянули грязного? Другого пути нет). Что приводит к вопросу: какова дополнительная функциональность? Это просто ограничения, я использовал другой подход.
Некоторое время назад я разработал архитектуру meta-data Engine (MDE), мы разработали реализацию с командой (на C++), а также коммерческий программный продукт с использованием движка. Одна из целей состояла в том, чтобы заменить многие скучные классы данных их метамоделями, которые автоматически создавали рутинные структуры данных. Одной из небольших частей движка была поддержка доменов данных на уровне meta2, а Домены определяли примитивные типы, включая ограничения (такие как кратность, которая является ограничением для мощности).
Видите ли, когда вы обертываете свой двойной тип данных, вы смешиваете его значение (data, meta⁰-data) с meta1-данными, такими как constraint. Вы можете уйти от этого, если создадите универсальные структуры данных (например, неограниченное количество строковых, целочисленных, булевых, перечислительных и плавающих свойств). Содержание структуры и правила управляются meta1-данными (имена свойств, описания, ссылки на домены и, возвращаясь к сути, ограничения). Каждый экземпляр структуры данных meta⁰-data сохраняет ссылку на свой тип meta1-data. Универсальное правило для работы с универсальными структурами данных использует ограничения.
—СА