Шаблон 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, эффективно включенным в унаследованное имя класса. Этот подход менее сложен, чем метафункциональный подход.

Другие вопросы по тегам