Преобразовать параметр шаблона в Typedef

#c #templates #type-conversion #typedef

#c #шаблоны #преобразование типов #typedef

Вопрос:

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

 template <class X>
class C
{
    using Y = unsigned X;
};
  

что неверно: error: type-id cannot have a name

Возможно ли это вообще, и если да, то как?

Ответ №1:

Вы ищете std::make_unsigned :

 template <class X>
class C
{
    using Y = std::make_unsigned_t<X>;
};
  

Комментарии:

1. @NathanOliver: ты имеешь в виду typename std::make_unsigned<X>::type ? wandbox std::make_unsigned_t это псевдоним C 14, который не требует ::type завершения в псевдонимах.

2. Примечание: вы пропускаете ошибку времени компиляции для недопустимого типа, у вас просто есть UB в данный момент. static_assert(std::is_signed<T>::value || std::is_unsigned<T>::value, "Expected signed/unsigned type");

3. Извините. Пропустил _t в конце.