C ++ пустой класс или typedef - PullRequest
       36

C ++ пустой класс или typedef

5 голосов
/ 01 февраля 2010

Я сейчас использую что-то подобное в моем коде:

class B : public A<C> { };

Не лучше ли использовать typedef?

typedef A<C> B;

Ответы [ 7 ]

16 голосов
/ 01 февраля 2010

Это зависит. Если вы хотите, чтобы A<C> и B были разными, но связанными типами, B должно расширяться A<C> Если вы хотите, чтобы они были идентичными, вы должны использовать typedef. Можете ли вы предоставить больше контекста?

4 голосов
/ 01 февраля 2010

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

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

2 голосов
/ 01 февраля 2010

Это не совсем то же самое. Например, с помощью typedef вы можете сделать это:

typedef A<C> B;
func(B param) {...}
...
A<C> var;
func(var);
2 голосов
/ 01 февраля 2010

Совершенно определенно, если целью является присвоение нового имени существующему типу данных, тогда используйте typedef.

1 голос
/ 01 февраля 2010

Зависит от того, что вы хотите, эффект не тот.

C ++ typedefs не являются "сильными", что в основном означает, что B и A<C> будут одного типа. Если вы хотите различать их, используйте класс.

В Интернете можно найти различные реализации сильного определения типа, например, ускоренного .

1 голос
/ 01 февраля 2010

Что ж, я предполагаю, что вы используете пустой класс для повторного ввода A<C>. В этом случае я думаю, что typedef - лучшая идея. По крайней мере, похоже, что так и делают чаще всего.

Позвольте мне добавить, что это только мое мнение. Люди не совсем согласны с использованием typedef в целом. Хотя я думаю, что в этом случае все в порядке.

Прочитав ответ Джона Перди, я хотел бы добавить, что вам следует использовать наследование, если вам нужно расширить А, а не иначе.

0 голосов
/ 09 декабря 2014

Для полноты хочу добавить еще один пункт: С

class B : public A<C> { };

Вы можете легко объявить B:

class B;
void func(B param);
...