Шаблоны typedefs - Какова ваша работа?

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

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

Ответ 1

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

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

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, как указал Даниэль в его комментарии.)

Ответ 2

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

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

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

EDIT: Да, это ответ на сообщение ShaChris23. Я, вероятно, пропустил что-то, потому что он появился выше его/ее сообщения, а не ниже.

Ответ 3

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