Шаблон typedefs - Какая у вас работа?

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

Что вы хотели бы использовать в качестве обходного пути? Контейнерные объекты или Макросы? Чувствуете ли вы, что оно того стоит?

71 голос | спросил George Godik 25 PM00000060000000031 2008, 18:47:00

3 ответа


0
  

Что вы хотели бы использовать в качестве обходного пути? Контейнерные объекты или Макросы? Чувствуете ли вы, что оно того стоит?

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

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

ответил Konrad Rudolph 25 PM00000060000000131 2008, 18:51:01
0
template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};

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

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

РЕДАКТИРОВАТЬ: Да, это ответ на пост ShaChris23. Я, вероятно, что-то пропустил, потому что это показывалось над его /ее сообщением, а не ниже.

ответил xghost 19 Jam1000000amTue, 19 Jan 2010 02:01:11 +030010 2010, 02:01:11
0

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

ответил Andrei Pokrovsky 19 MaramTue, 19 Mar 2013 04:31:33 +04002013-03-19T04:31:33+04:0004 2013, 04:31:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132