double_uint_t<Type>, half_uint_t<Type>
От: Videoman Россия https://hts.tv/
Дата: 10.10.19 13:19
Оценка:
Рад приветствовать всех гуру С++, кто готов помочь со следующим вопросом: сейчас в одной подсистеме нашей библиотеки активно понадобилось создавать типы в два раза большие и в два раза меньшие, по количеству бит, типа:

uint32_t -> uint64_t или uint32_t -> uint_16 // и т.д.

Сейчас это сделал с помощью самописанных type traits, ничего сложного:
// Дальше используется как-то так:
double_uint_t<uint32_t> a; // а будет 64-х битным
half_uint_t<uint32_t> b;   // b будет 16-и битным

Но вот задумался, а не подвезли ли уже в С++17 что-то готовое. Просто не хочется использовать велосипед который уже есть в стандарте или не нужен по причине того что нужный функционал достигается гораздо проще. Кто что посоветует?
Re: double_uint_t<Type>, half_uint_t<Type>
От: Chorkov Россия  
Дата: 10.10.19 15:06
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Рад приветствовать всех гуру С++, кто готов помочь со следующим вопросом: сейчас в одной подсистеме нашей библиотеки активно понадобилось создавать типы в два раза большие и в два раза меньшие, по количеству бит, типа:

V>

V>uint32_t -> uint64_t или uint32_t -> uint_16 // и т.д.

V>Сейчас это сделал с помощью самописанных type traits, ничего сложного:
V>
V>// Дальше используется как-то так:
V>double_uint_t<uint32_t> a; // а будет 64-х битным
V>half_uint_t<uint32_t> b;   // b будет 16-и битным
V>

V>Но вот задумался, а не подвезли ли уже в С++17 что-то готовое. Просто не хочется использовать велосипед который уже есть в стандарте или не нужен по причине того что нужный функционал достигается гораздо проще. Кто что посоветует?

В 17-м — нет. Но подходящие запчасти есть boost (boost::uint_t) :
https://www.boost.org/doc/libs/1_67_0/libs/integer/doc/html/boost_integer/integer.html

template< typename T> typedef typename boost::uint_t< std::numeric_limits<T>::digits * 2 >::exact  double_uint_t;
template< typename T> typedef typename boost::uint_t< std::numeric_limits<T>::digits / 2 >::exact  half_uint_t;
Re[2]: double_uint_t<Type>, half_uint_t<Type>
От: Videoman Россия https://hts.tv/
Дата: 10.10.19 15:25
Оценка:
C>В 17-м — нет. Но подходящие запчасти есть boost (boost::uint_t) :
C>https://www.boost.org/doc/libs/1_67_0/libs/integer/doc/html/boost_integer/integer.html

C>
C>template< typename T> typedef typename boost::uint_t< std::numeric_limits<T>::digits * 2 >::exact  double_uint_t;
C>template< typename T> typedef typename boost::uint_t< std::numeric_limits<T>::digits / 2 >::exact  half_uint_t;
C>

Жалко, будем искать ...
Re[3]: double_uint_t<Type>, half_uint_t<Type>
От: reversecode google
Дата: 10.10.19 18:55
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Жалко, будем искать ...


https://www.youtube.com/watch?v=9fI23Wb32jU
Re: double_uint_t<Type>, half_uint_t<Type>
От: rg45 СССР  
Дата: 12.10.19 07:14
Оценка: +3
Здравствуйте, Videoman, Вы писали:

V>
V>// Дальше используется как-то так:
V>double_uint_t<uint32_t> a; // а будет 64-х битным
V>half_uint_t<uint32_t> b;   // b будет 16-и битным
V>

V>Но вот задумался, а не подвезли ли уже в С++17 что-то готовое. Просто не хочется использовать велосипед который уже есть в стандарте или не нужен по причине того что нужный функционал достигается гораздо проще. Кто что посоветует?

По существу заданного вопроса мне сказать особо нечего, но очень напрягает такое использование слова "double". Я бы постарался поискать другие варианты имен.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: double_uint_t<Type>, half_uint_t<Type>
От: Videoman Россия https://hts.tv/
Дата: 13.10.19 12:10
Оценка:
Здравствуйте, rg45, Вы писали:

R>По существу заданного вопроса мне сказать особо нечего, но очень напрягает такое использование слова "double". Я бы постарался поискать другие варианты имен.


Полностью согласен с вами. Никак не мог придумать название четко отражающее суть, но без использования double. На данном этапе мне не принципиально. Готов рассмотреть предложенный вами лучший вариант . В свое оправдание могу только заметить, что и название стандартного типа: дроби с плавающей точной — double, не совсем удачное. У себя в проектах мы всегда используем float32_t и float64_t.
Re[3]: double_uint_t<Type>, half_uint_t<Type>
От: rg45 СССР  
Дата: 13.10.19 16:21
Оценка:
Здравствуйте, Videoman, Вы писали:

V>
V>// Дальше используется как-то так:
V>double_uint_t<uint32_t> a; // а будет 64-х битным
V>half_uint_t<uint32_t> b;   // b будет 16-и битным
V>


V>Полностью согласен с вами. Никак не мог придумать название четко отражающее суть, но без использования double. На данном этапе мне не принципиально. Готов рассмотреть предложенный вами лучший вариант . В свое оправдание могу только заметить, что и название стандартного типа: дроби с плавающей точной — double, не совсем удачное. У себя в проектах мы всегда используем float32_t и float64_t.


Ну предложить решение всегда труднее, чем просто покритиковать

На счет неудачного использования double для обозначения чисел с плавающей точкой согласен. Но изменить это не в наших силах, к сожалению, поэтому как-то с этим нужно жить. В качестве альтернативного подхода могу предложить известный трюк: перенесение части имени в параметры шаблона. И тогда рассматриваемый фрагмент мог бы выглядеть как-то так:

expand<uint32_t, 2> a; // а будет 64-х битным
shrink<uint32_t, 2> b; // b будет 16-и битным
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 13.10.2019 17:18 rg45 . Предыдущая версия .
Re[4]: double_uint_t<Type>, half_uint_t<Type>
От: Videoman Россия https://hts.tv/
Дата: 14.10.19 12:44
Оценка:
Здравствуйте, rg45, Вы писали:
R>
R>expand<uint32_t, 2> a; // а будет 64-х битным
R>shrink<uint32_t, 2> b; // b будет 16-и битным
R>

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