Введение
У меня есть алгоритм, который берет указатель на массив char
. Алгоритм сначала извлекает длину массива, а затем переворачивает массив.
Проблема
Проблема в том, что я хочу использовать это в массиве wchar_t
. И хотите иметь возможность сделать это без необходимости копировать всю функцию, изменять имя и тип аргумента.
Вот упомянутая функция:
void reverseString(char *str){
unsigned int l = getStringLength(str);
int i = 0;
int m = l >> 1;
while(i < m){
str[i] ^= str[l - 1];
str[l - 1] ^= str[i];
str[i] ^= str[l - 1];
i++;
l--;
}
}
Начиная с поиска в Google и чтения SO, он не сможет использовать указатель void
(концептуально то же самое, используя union
), поскольку это оставит мне решение, подобное этому, что для меня так же плохо, как написание отдельных функций, но с разными именами и типами аргументов:
void reverseString(void *array, short typeSize){
unsigned int l = getArrayLength(array);
int m = l >> 1;
int i = 0;
char *str = 0;
wchar_t *wstr = 0;
if(typeSize == 1){
str = (char *) array;
while(i < m){
str[i] ^= str[l - 1];
str[l - 1] ^= str[i];
str[i] ^= str[l - 1];
i++;
l--;
}
}else if(typeSize == 4){
wstr = (wchar_t *) array;
while(i < m){
wstr[i] ^= wstr[l - 1];
wstr[l - 1] ^= wstr[i];
wstr[i] ^= wstr[l - 1];
i++;
l--;
}
}
}
Примечание: getStringLength
- это просто функция, которая перебирает указатель, пока не достигнет '\0'
и не вернет сумму итерации.
Ответ
Я ищу ответ, который говорит мне, как сделать это лучше, без необходимости переписывать внутреннюю часть алгоритма, или ответ, говорящий о том, что это невозможно сделать другим способом. Я не ищу ответ, говорящий мне, что я должен использовать эту и ту библиотеку, которая делает это для меня, потому что я не использую это в производственном коде, это чисто образовательное, чтобы лучше понять, как работает управление памятью и другие понятия так.
Редактировать: Функция, которую я показал, является лишь примером, я ищу универсальное решение проблем с алгоритмами.