В C++ имеет смысл реализовать эту функцию для всех неподписанных типов (сохраняя одно и то же имя функции). В C это невозможно, но вы можете создавать различные функции для всех типов, как left_circular_shift_64
т.д.
Если вы хотите сохранить свой интерфейс, то вы должны преобразовать void*
в uint64_t*
(не uint64_t
). Также может быть полезно указать size
в байтах, а не в битах. Тогда может быть использована следующая конструкция:
uint64_t value;
left_circular_shift(&value, sizeof(value));
Это поможет, если, например, тип value
изменяется на uint32_t
.
Даже если эта опция действительна и «безопасна», я бы предложил использовать различные функции для каждого типа. Некоторые причины, чтобы поддержать этот вариант:
- Это невозможно передать о неверных данных функции, например,
float
, struct
или объект.
- Невозможно передать неправильную размер функции, например. 62. Таким образом, вам не нужно изобретать, что делать, если функция получает странный ввод.
- Вам не нужно поддерживать оба параметра (указатель и размер), что уменьшает вероятность ошибок.
- В C++ могут возникнуть проблемы с литьем
void*
в некоторые сложные типы (например, классы с множественным наследованием), если вам нужно реализовать операцию переключения для таких типов.
Макрос типового типа может быть полезным подходом. –
Вы хотите преобразовать 'void *' в 'uint64_t' или' uint64_t * '? Это имеет большое значение. –