Есть ли у D 'newtype'?

Имеется ли в D 'newtype' (как в Haskell).

Это наивный вопрос, поскольку я просто просматриваю D, но Google не обнаружил ничего полезного.

В Haskell это способ сделать разные типы одного и того же объекта разными во время компиляции, но без каких-либо потерь производительности во время выполнения.

например, вы можете создавать новые типы (двойники) для метры, секунды и килограммы. Это привело бы к ошибке во время компиляции, если бы ваша программа добавляла количество в метрах к количеству в секундах, но было бы так же быстро во время выполнения, как если бы оба были двойными (что они есть во время выполнения).

Если D не имеет что-то похожее на «новый тип», каковы общепринятые методы работы с размерными величинами?

Спасибо,

Крис.

9
задан Don Stewart 22 April 2011 в 21:31
поделиться

2 ответа

В D1.0 есть typedef, который представляет собой строгую типизацию от предопределенного типа к «новому типу».

D2.0 удалил это, и остался только псевдоним (то, что typedef есть в C). Ходят разговоры о наличии шаблона-оболочки, который может сильно создать новый тип.

Проблема с typedef заключалась в том, что были веские аргументы в пользу того, чтобы сделать новый тип подтипом предопределенного типа, а также веские аргументы в пользу того, чтобы сделать его супертипом.

Семантика typedef заключается в том, что базовый тип неявно преобразуется в новый тип, но новый тип не преобразуется в базовый тип или другие типы с таким же базовым типом. Я использую здесь базовый тип, поскольку:

typedef int Fish;
typedef Fish Cat;
Fish gold = 1;
Cat fluff = gold;

Не скомпилируется.

И на данный момент 2.048 DMD по-прежнему позволяет использовать typedef (но не использовать его).

Преобразование базового типа в новый тип полезно, так что вам не нужно писать

meters = cast(meters) 12.7;
12
ответ дан 4 December 2019 в 11:39
поделиться

Забавно, как упоминает he_the_great, у D1 было строгое typedef, но никто им не пользовался, возможно, потому, что было невозможно настроить точную семантику для каждого случая. Возможно, самый простой способ справиться с этой ситуацией, по крайней мере, для примитивных типов, состоит в том, чтобы включить где-нибудь в Phobos шаблон миксина, который позволит вам пересылать все операторы, но иметь шаблон для этого, автоматически сгенерированный через миксин. Тогда вы просто создадите структуру-оболочку и все будет готово.

6
ответ дан 4 December 2019 в 11:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: