Глобальная перегрузка оператора типа? - PullRequest
6 голосов
/ 22 декабря 2011

Я пишу некоторый «переносимый» код (это означает, что он предназначен для 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 смешным).

Ответы [ 3 ]

3 голосов
/ 04 октября 2012

Глобальный оператор приведения (typecast) , глобальный оператор присваивания, глобальный оператор индекса и перегрузка оператора глобального вызова функций не разрешены в C ++ .

MSVS C ++ будет генерировать C2801 ошибок на них. Посмотрите в вики список операторов C ++ и их правила перегрузки.

1 голос
/ 24 декабря 2011

Я не большой поклонник использования оператора [ab], но вот для чего нужен c ++?

Вы можете сделать следующее:

const char* operator+(const uint8* foo) 
{ 
  return (const char *)foo; 
}

char* operator+(uint8* foo) 
{ 
  return (char *)foo; 
}

С определенными,ваш пример сверху:

uint32 len2 = strlen(foo2);

станет

uint32 len2 = strlen(+foo2); 

Это не автоматическое приведение, но таким образом у вас есть простой, но явный способ сделать это.

0 голосов
/ 24 декабря 2011

Оба компилятора, о которых вы упомянули, имеют переключатель "рассматривать символы как неподписанные".Почему бы не использовать это?

...