Допустимое использование typedef? - PullRequest
5 голосов
/ 24 февраля 2009

У меня есть буфер char (т. Е. Байт), который я отправляю по сети. В какой-то момент в будущем я могу захотеть переключить буфер на другой тип, например unsigned char или short. Я думал о том, чтобы сделать что-то вроде этого:

typedef char bufferElementType;

И всякий раз, когда я что-то делаю с элементом буфера, я объявляю его как bufferElementType, а не char. Таким образом, я мог бы переключиться на другой тип, изменив этот typedef (конечно, это не было бы так просто, но по крайней мере было бы легко определить места, которые нужно изменить ... там будет bufferElementType рядом, поблизости).

Это правильное / правильное использование typedef? Разве это не стоит хлопот? Будет ли у меня головная боль в будущем? Это заставит программистов обслуживания ненавидеть меня?

Я прочитал Когда я должен использовать Typedef в C ++ , но на самом деле никто не рассмотрел это.

Ответы [ 3 ]

11 голосов
/ 24 февраля 2009

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

Другой вариант - использовать шаблоны, чтобы избежать исправления типа до момента компиляции. Класс, который определяется как:

template <typename CharType>
class Whatever
{
   CharType aChar;
   ...
};

может работать с любым выбранным вами типом символа, в то же время он одинаково реагирует на все операторы.

2 голосов
/ 24 февраля 2009

Еще одним преимуществом typedefs является то, что при разумном использовании они могут улучшить читаемость. В качестве очень глупого примера, Метр и Степень могут быть двойными, но вы хотели бы различать их. Использование typedef - это быстрое и простое решение, позволяющее сделать ошибки более заметными .

Примечание : более надежное решение для приведенного выше примера состояло бы в создании различных типов для метра и градуса. Таким образом, компилятор может принудительно применять вещи сам. Это требует немного работы, которая, однако, не всегда окупается. Использование typedefs - это быстрый и простой способ сделать ошибки видимыми , как описано в статье, приведенной выше.

1 голос
/ 24 февраля 2009

Да, это идеальное использование для typedef, по крайней мере, в C.

Для C ++ можно утверждать, что шаблоны - лучшая идея (как предложил Диего Севилья), но у них есть свои недостатки. (Дополнительная работа, если все, что использует тип данных, еще не обернуто в несколько классов, более медленное время компиляции и более сложная структура исходного файла и т. Д.)

Также имеет смысл объединить два подхода, то есть дать имя typedef параметру шаблона.

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

Еще одним решением было бы создание класса "BufferElementType" с вспомогательными методами (convertToNetworkOrderBytes ()), но я держу пари, что это будет излишним для вас.

...