вычислительные типы C ++ с ограниченным использованием - PullRequest
1 голос
/ 01 марта 2011

Я хотел бы иметь способ определения вычислительных типов (например, somethng, который действует как «ограниченный int »), которые автоматически не преобразуются в свои базовые типы или друг в друга - поведение, подобноек типизированным указателям.

Например, я хотел бы иметь возможность определять типы XCoord и YCoord для координат X и Y.Я могу сделать это с помощью typedef, конечно же, , и это делает мой код более явным, но я действительно хочу, чтобы компилятор жаловался, когда я случайно передаю координату Y в качестве аргумента вызова функции, когда должениспользовал координату XДругой вариант использования - связывание размерных единиц с числами, чтобы получить жалобу, если кто-то случайно добавил число в метрах в весе в граммах.

Да, я знаю, этот пример упрощен и глоссарийнад многими проблемами.Я хотел бы указать числовые значения.Я хотел бы перебрать диапазоны значений.Я хотел бы вычесть два значения XCoord (и получить int ?).Я хотел бы использовать их в качестве подписчиков массива.Я уверен, что есть целый ряд способов, о которых я не задумывался подробно, и хотя было бы неплохо, чтобы все они работали прозрачно, я не против небольшого синтаксического неудобства (например, вызова функции-члена).в некоторых случаях.

В основном я вижу, как собрать решение с шаблонами и перегрузкой операторов и, вероятно, получить большую часть того, что я хочу.Однако я надеюсь, что есть решение, создатели которого уже проделали тяжелую работу, исследовали угловые случаи и сделали надлежащие компромиссы между удобством и функциональностью.

И, конечно, они 'это просто базовые типы с добавленной проверкой во время компиляции - поэтому решение должно иметь нулевые потери производительности во время выполнения относительно базовых типов, как typedef

Существует ли такая вещь?Является ли решение, использующее языковые контракты, настолько сложным и удивительным, что мне было бы лучше использовать обычный старый typedefs и инструмент, подобный lint ?И если да, то есть ли такой инструмент?

Ответы [ 3 ]

1 голос
/ 01 марта 2011

Вы смотрели на повышение :: единиц ?

1 голос
/ 01 марта 2011

В основном я вижу, как совместить решение с шаблонами и перегрузкой операторов, и, вероятно, получить большую часть того, что я хочу.Однако я надеюсь, что есть решение, создатели которого уже проделали тяжелую работу, исследовали угловые случаи и сделали надлежащие компромиссы между удобством и функциональностью.

По моему опыту, этиКомпромиссы варьируются в зависимости от типа и применения.Например, является ли конструкция из и / или преобразование в базовый тип неявной, имеет ли смысл использовать побитовые операторы для двух значений типа или логические операторы, увеличение / уменьшение до / после, += *= и т. Д.Некоторые из этих вещей могут быть опционально и кратко определены с помощью CRTP или макроса препроцессора создания типа, который принимает необязательные аргументы с другими макросами, представляющими группы таких функций.Я делал подобные вещи раньше в нескольких разных контекстах, но не знаю ни о какой свободно доступной и такой же гибкой многоразовой библиотеке.Если вы реализуете это с помощью макросов, хорошо, что вы можете тем самым указать имя класса для создания уникального типа.(Например, см. Библиотеку BENUM в хранилище буста - http://www.boostpro.com/vault). BOOST_STRONG_TYPEDEF Boost имеет это преимущество, но ему не хватает гибкости.

Если вы используете шаблоны напрямую, как в template <typename T> class Unique { ... };, тогда вы 'Вы обнаружите, что вы не можете создать два разных типа с одним и тем же базовым типом (параметр шаблона). Вы можете решить эту проблему, передавая некоторый уникальный номер в шаблон, как в template <typename T, int Id>. Для этого необходимо вручную предоставлять уникальные целые числа каждый раз, когда вы создаете экземплярtemplate - боль в обслуживании. Если вам нужно автоматизировать это распределение, и все использование в одном файле, вы можете указать __LINE__ (или сделать это с помощью макроса), в противном случае, возможно, также шаблон на const char * и дать ему __FILE__или ищите специфичное для компилятора расширение препроцессора для генерации соответственно уникальных номеров / идентификаторов.

1 голос
/ 01 марта 2011

Я считаю, повышение . сериализация BOOST_STRONG_TYPEDEF должно соответствовать вашим требованиям.

...