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