Определения типов шаблонов. Чем вы занимаетесь?

StackOverflow https://stackoverflow.com/questions/26151

  •  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.Вероятно, я что-то пропустил, потому что это появилось над его сообщением, а не внизу.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top