Определения типов шаблонов. Чем вы занимаетесь?
-
09-06-2019 - |
Вопрос
В C++ 0x есть псевдонимы шаблонов (иногда называемые определениями типов шаблонов).Видеть здесь.Текущая спецификация C++ этого не делает.
Что вам нравится использовать в качестве обходного пути?Объекты-контейнеры или макросы?Вы чувствуете, что оно того стоит?
Решение
Что вам нравится использовать в качестве обходного пути?Объекты-контейнеры или макросы?Вы чувствуете, что оно того стоит?
Канонический способ — использовать такую метафункцию:
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.Вероятно, я что-то пропустил, потому что это появилось над его сообщением, а не внизу.
Иногда вы можете просто явно написать нешаблонные определения типов для всех необходимых типов.Если базовый класс создан на основе нескольких аргументов шаблона и только один тип требуется определить по типу, вы можете наследовать специализированный класс с определением типа, фактически включенным в имя наследуемого класса.Этот подход менее заумный, чем подход метафункций.