2011-12-21 12 views
6

Piszę trochę „przenośny” kodu (co oznacza, że ​​cele 32- i 64-bitowy MSVC2k10 i GCC na Linuksie), w których mam, bardziej lub mniej:Przeciążenie globalnego operatora typograficznego?

typedef unsigned char uint8; 

C-ciągi są zawsze Uint8 ; jest to ze względów przetwarzania strun. Wcześniejszy kod wymaga kompilacji skompilowanej jako podpisany, więc nie mogę ustawić przełączników kompilatora na domyślne niepodpisane. Ale jeśli mam przetwarzania ciąg nie mogę bardzo dobrze indeks tablicy:

char foo[500]; 
char *ptr = (foo + 4); 
*ptr = some_array_that_normalizes_it[*ptr]; 

Nie można Indeks tablica z liczby ujemnej w czasie wykonywania bez poważnych konsekwencji. Brak niepodpisanych łańcuchów C pozwala na łatwiejszą ochronę przed błędami.

Naprawdę nie chciałbym mieć odlewania (char *) za każdym razem, gdy używam funkcji, która przyjmuje char *, a także przestań powielać funkcje klasowe, tak aby one działały. Jest to szczególnie uciążliwe, ponieważ ciąg stały jest niejawnie przekazywane jako char *

int foo = strlen("Hello"); // "Hello" is passed as a char * 

chcę wszystko to do pracy:

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 

prawdopodobnie istnieją zastrzeżenia do pozwalając niejawne konwersje typów tego rodzaju jednak byłoby miło korzystać z funkcji, które za każdym razem pobierają znak * bez rzutowania.

Więc pomyślałem, coś jak to będzie działać:

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

Jednak tak nie jest. Nie mogę wymyślić, jak to działa. Nie mogę też znaleźć niczego, co mogłoby mi powiedzieć, dlaczego wydaje się, że nie ma sposobu, aby to zrobić. Widzę możliwą logikę - takie ukryte konwersje mogą być przyczyną zbyt wielu błędów - ale nie mogę znaleźć niczego, co mówi "to nie zadziała w C++" lub dlaczego, lub jak sprawić, żeby działało (brak zrobienie uin8 klasy, która jest niedorzeczna).

+3

Nie możesz pisać odlewane (lub operatorów), które nie obejmują co najmniej jeden typ zdefiniowany przez użytkownika –

+0

Masz starszych kod, który używa 'podpisaną char' ?? Bardzo wątpię, że ... –

+2

Dlaczego czynisz klasę uint8 niedorzeczną? Nie jest to nic bardziej absurdalnego niż posiadanie bandy zabłąkanych funkcji globalnego castingu. – ThomasMcLeod

Odpowiedz

1

Nie jestem wielkim fanem operatora [ab] przy użyciu, ale to jest to, co C++ jest dla dobra?

można wykonać następujące czynności:

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

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

Z zdefiniowane, Twój przykład z góry:

uint32 len2 = strlen(foo2); 

staną

uint32 len2 = strlen(+foo2); 

To nie jest automatyczne cast, ale w ten sposób masz łatwy, ale wyraźny sposób robienia tego.

+0

Dziękuję, dobry pomysł! –

+0

Wow ............ –

0

Obydwa wymienione kompilatory mają przełącznik "traktuj znaki jako unsigned". Dlaczego nie skorzystać z tego?

+0

Łamanie starego kodu. Tak jak powiedziałem w ... drugim zdaniu. –

+0

Oh ... Nie jestem pewien co do natury twojego programu. Myślałem, że piszesz coś nowego! (jak powiedziałeś w pierwszym zdaniu) –

3

Globalny obsada (typecast) operatora globalny operator przypisania globalny operator tablicy dolny i globalnej funkcji operatora połączeń przeciążenia są niedozwolone C++.

MSVS C++ zostanie wygenerowany na nich C2801 errors. Look at wiki dla listy operatorów C++ i ich przeciążających reguł.

Powiązane problemy