Рад приветствовать всех гуру С++, кто готов помочь со следующим вопросом: сейчас в одной подсистеме нашей библиотеки активно понадобилось создавать типы в два раза большие и в два раза меньшие, по количеству бит, типа:
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 что-то готовое. Просто не хочется использовать велосипед который уже есть в стандарте или не нужен по причине того что нужный функционал достигается гораздо проще. Кто что посоветует?
Здравствуйте, 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 что-то готовое. Просто не хочется использовать велосипед который уже есть в стандарте или не нужен по причине того что нужный функционал достигается гораздо проще. Кто что посоветует?
V>// Дальше используется как-то так:
V>double_uint_t<uint32_t> a; // а будет 64-х битным
V>half_uint_t<uint32_t> b; // b будет 16-и битным
V>
V>Но вот задумался, а не подвезли ли уже в С++17 что-то готовое. Просто не хочется использовать велосипед который уже есть в стандарте или не нужен по причине того что нужный функционал достигается гораздо проще. Кто что посоветует?
По существу заданного вопроса мне сказать особо нечего, но очень напрягает такое использование слова "double". Я бы постарался поискать другие варианты имен.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>По существу заданного вопроса мне сказать особо нечего, но очень напрягает такое использование слова "double". Я бы постарался поискать другие варианты имен.
Полностью согласен с вами. Никак не мог придумать название четко отражающее суть, но без использования double. На данном этапе мне не принципиально. Готов рассмотреть предложенный вами лучший вариант . В свое оправдание могу только заметить, что и название стандартного типа: дроби с плавающей точной — double, не совсем удачное. У себя в проектах мы всегда используем float32_t и float64_t.
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-и битным
--
Не можешь достичь желаемого — пожелай достигнутого.
R>expand<uint32_t, 2> a; // а будет 64-х битным
R>shrink<uint32_t, 2> b; // b будет 16-и битным
R>
Ну вот опять вы заставили меня задуматься . Так выходит что эти генераторы типов используются в коде где целочисленная математика и я не уверен что ваши варианты будут однозначно трактоваться. Нужно будет подумать. Я уже рассматривал эти пары, просто.