Сведения о вопросе

nikolya

20:44, 27th August, 2020

Теги

c++   templates   type-safety    

Template typedefs - над чем вы работаете?

Просмотров: 426   Ответов: 3

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

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



  Сведения об ответе

ASSembler

14:58, 7th August, 2020

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

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

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% того времени. Использование macros здесь не стоит многих недостатков.

(EDIT: я внес поправки в кодекс, чтобы отразить Boost/STL конвенции, как указал Даниэль в своем комментарии.)


  Сведения об ответе

LAST

19:39, 3rd August, 2020

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

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

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

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


  Сведения об ответе

FAriza

19:27, 29th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться