Простые типы с более высоким значением (C ++ 11)

Я часто сталкиваюсь с ситуациями (в моем коде C ++ / C ++ 11), где у меня есть тип, который в основном ведет себя как встроенный тип (или «базовый простой» тип, такой какstd::string), но это имеет значение за пределами 32-битного числа или группы символов. Я не нашел ничего полезного в интернете, потому что не знаю, какие термины искать ...

Примеры:

Однажды я работал в системе, где элементы были идентифицированы по идентификатору. И эти идентификаторы былиstd::strings (вероятно, не самая лучшая идея, но это другая история). Что действительно плохо, так это то, что эти идентификаторы были переданы через систему какstd::stringс или какconst char*s. Поэтому было трудно (невозможно) определить, где в коде использовались базовые идентификаторы при поиске типа. Все имена переменных были вариациями идентификатора (ID, id, Id) или ключа, или просто i, или name, или чего-то еще. Таким образом, вы не можете искать по имени. Поэтому я бы предпочел передать эти переменные как типid_t.Сетевые порты: ониuint16_ts. Но я хотел бы передать их какnetwork_port_ts.

Я обычно использовал typedef, чтобы сделать вещи немного лучше. Этот подход имеет несколько проблем, хотя:

Вам не нужно использовать typedef. Вы все еще можете передавать переменные по типу «raw» (например,std::string вместоid_t).Если необработанный тип является шаблоном, вы закончили с предварительным объявлением typedef (например, с shared_ptr).«Объявление вперед» typedef является проблемой обслуживания. Если тип raw изменяется, вы можете изменить материал повсюду.

Еще одна вещь, которую я попробовал на примере сетевого порта, - это написание тонкого класса-обертки,operator uint16_t, Это решило проблему с предварительными декларациями. Но затем я попал в ловушку с некоторыми макросами регистрации, которые использовали printf для внутреннего использования. Printfs все еще работал (хорошо, скомпилированный), но не печатал номер порта, но (я думаю) адрес объекта.

Я решил, что с размерами, такими как вес или длина, Boost.Units может стоить посмотреть (даже если он выглядит немного «тяжелым»). Но для двух приведенных выше примеров это не подходит.

Как лучше всего достичь того, чего я хочу (вариант с Boost - вариант)?

Короче: Чего я хочу добиться - это передать «типы с более высоким значением» как свой собственный тип, а не как простой тип raw / low level / non-abstract. (Вид) как иметь определенный пользователем тип. Желательно без огромных накладных расходов на написание полного класса для каждого типа с практически идентичными реализациями, только чтобы иметь возможность делать то, что уже могут делать встроенные модули.

Ответы на вопрос(3)

Ваш ответ на вопрос