Я пишу некоторый «переносимый» код (это означает, что он предназначен для 32- и 64-битных MSVC2k10 и GCC в Linux), в котором у меня есть, более или менее:
typedef unsigned char uint8;
C-строки всегда uint8; это из соображений обработки строк. Устаревший код требует, чтобы char компилировался как подписанный, поэтому я не могу установить для переключателей компилятора значение по умолчанию как unsigned Но если я обрабатываю строку, я не очень хорошо могу индексировать массив:
char foo[500];
char *ptr = (foo + 4);
*ptr = some_array_that_normalizes_it[*ptr];
Вы не можете индексировать массив с отрицательным числом во время выполнения без серьезных последствий. Хранение C-струн без знака позволяет упростить защиту от ошибок.
Мне бы очень хотелось, чтобы мне не приходилось постоянно приводить (char *) каждый раз, когда я использую функцию, которая принимает char *, а также прекращает дублирование функций класса, чтобы они брали и то и другое. Это особенно неприятно, потому что строковая константа неявно передается как символ *
int foo = strlen("Hello"); // "Hello" is passed as a char *
Я хочу, чтобы все это работало:
char foo[500] = "Hello!"; // Works
uint8 foo2[500] = "Hello!"; // Works
uint32 len = strlen(foo); // Works
uint32 len2 = strlen(foo2); // Doesn't work
uint32 len3 = strlen((char *)foo2); // Works
Вероятно, есть предостережения, разрешающие неявные преобразования типов такого рода, однако было бы неплохо использовать функции, которые каждый раз принимают char * без приведения.
Итак, я подумал, что-то вроде этого будет работать:
operator char* (const uint8* foo) { return (char *)foo; }
Однако это не так. Я не могу придумать способ заставить это работать. Я также не могу найти ничего, чтобы сказать мне, почему, кажется, нет никакого способа сделать это. Я вижу возможную логику - неявные преобразования, подобные этому, могут быть причиной FAR слишком большого количества ошибок - но я не могу найти ничего, что говорит "это не будет работать в C ++" или почему, или как заставить это работать (если не считать сделать класс uin8 смешным).