Я программирую приложение, которое позволяет пользователю выбирать размер в битах целочисленного хранилища и делать с ним математику. Они могут выбрать 8, 16, 32 или 64-битное хранилище как со знаком или без знака. Это устанавливается и изменяется во время выполнения, и приложение будет выполнять математические операции с данным типом.
Пример взаимодействия с пользователем:
Я хотел бы избежать программирования 8 случаев для каждого оператора. Я полагаю, что указатель или указатель на функцию могут хорошо работать для этого. Методу оценки не важно, какой размер целого числа я использую, если они оба одинаковы. Проблема в том, что я не могу понять, как это реализовать, так как указатели заботятся о том, какая переменная возвращается. Я подумал об использовании универсального указателя, но это не помогает мне, когда мне нужно разыменовать, мне все равно понадобится 8 случаев.
value1.getProperSize() + value2.getProperSize();
// * This obviously won't work
int* getProperSize() {
if (size == 16) return (int16_t)storageValue;
if (size == 32) return (int32_t)storageValue;
// Etc...
}
Любые мысли или предложения по поводу решения этой проблемы с благодарностью.
Вы не можете иметь «произвольный» тип возвращаемого значения для функции. Если вы хотите вернуть целое число другого размера, есть несколько способов сделать это: объединение, перегрузки функций, шаблоны (которые бы покрывали перегрузки функций) или a (и я сжимаюсь, когда я набираю это) void*
возвращаемое значение
Исходя из того, что вы спросили, профсоюз, вероятно, подойдет лучше всего:
struct MyInteger
{
uint8_t intSize;
union
{
int8_t Int8;
int16_t Int16;
int32_t Int32;
int64_t Int64;
} intValue;
};
MyInteger getProperSize()
{
MyInteger result;
if (size == 8)
{
result.intSize = 8;
result.intvalue.Int8 = someValue;
}
// ...
return result;
}
Размер этой структуры будет минимум 72 бита (исключая вопросы заполнения и выравнивания), так что вы можете просто вернуть int64_t
и это будет охватывать каждый меньший целочисленный размер.
Всегда сохраняйте значение как самый большой тип данных. Для вас важно усечение во время арифметики. Вы можете сделать это, передавая значение полной ширины плюс битовую ширину (режим).
Вам на самом деле не нужно делать арифметику с разными типами. Просто выполните вычисления с 64 битами и приведите результат к размеру бита.