Шаблон typedefs - Какая у вас работа? - PullRequest
71 голосов
/ 25 августа 2008

C ++ 0x имеет псевдонимы шаблонов (иногда их называют шаблонными типами) Смотрите здесь . Текущая спецификация C ++ не делает.

Что вы любите использовать для обхода? Контейнерные объекты или макросы? Чувствуете ли вы, что оно того стоит?

Ответы [ 3 ]

103 голосов
/ 25 августа 2008

Что вы любите использовать для обхода? Контейнерные объекты или макросы? Чувствуете ли вы, что оно того стоит?

Канонический способ - использовать метафункцию, например, так:

template <typename T>
struct my_string_map {
    typedef std::map<std::string, T> type;
};

// Invoke:

my_string_map<int>::type my_str_int_map;

Это также используется в STL (allocator::rebind<U>) и во многих библиотеках, включая Boost. Мы широко используем его в биоинформационной библиотеке .

Это раздутый, но это лучшая альтернатива в 99% случаев. Использование макросов здесь не стоит многих недостатков.

(РЕДАКТИРОВАТЬ: я изменил код, чтобы отразить соглашения Boost / STL, как указано Даниэлем в его комментарии.)

10 голосов
/ 19 января 2010
template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};

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

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

РЕДАКТИРОВАТЬ: Да, это ответ на пост ShaChris23. Я, вероятно, что-то пропустил, потому что это показывалось над его / ее сообщением, а не ниже.

0 голосов
/ 19 марта 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...