Шаблон typedefs - Какая у вас работа?
C++ 0x имеет псевдонимы шаблонов (иногда их называют шаблонами typedefs). Смотрите здесь. Текущая спецификация C++ не делает.
Что вы хотели бы использовать как обходной путь? Контейнерные объекты или Макросы? Чувствуете ли вы, что оно того стоит?
3 ответа
Что вы хотели бы использовать как обходной путь? Контейнерные объекты или Макросы? Чувствуете ли вы, что оно того стоит?
Канонический способ состоит в том, чтобы использовать метафункцию следующим образом:
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, как указано Даниэлем в его комментарии.)
template <typename T> struct my_string_map : public std::map<std::string,T> { };
Вы не должны наследовать от классов, у которых нет виртуального деструктора. Это связано с тем, что деструкторы в производных классах не вызываются, когда они должны быть, и вы можете получить нераспределенную память.
При этом вы могли *****, вероятно, ***** обойтись без него в приведенном выше примере, потому что вы не добавляете больше данных в свой производный тип. Обратите внимание, что это не одобрение. Я все еще советую тебе не делать этого. Тот факт, что вы можете сделать это, не означает, что вы должны.
РЕДАКТИРОВАТЬ: Да, это ответ на пост ShaChris23. Я, вероятно, что-то пропустил, потому что это показывалось выше его / ее сообщения, а не ниже.
Иногда вы можете просто явно записать необязательные определения типов для всех необходимых типов. Если базовый класс создан на основе нескольких шаблонных аргументов с одним типом, который требуется определить по типу, вы можете наследовать специализированный класс с typedef, эффективно включенным в унаследованное имя класса. Этот подход менее сложен, чем метафункциональный подход.