[英]Global typecast operator overload?
我正在編寫一些“可移植”代碼(意味着它針對Linux上的32位和64位MSVC2k10和GCC),我或多或少:
typedef unsigned char uint8;
C字符串總是uint8; 這是出於字符串處理的原因。 傳統代碼需要將char編譯為signed,因此我無法將編譯器開關設置為默認為unsigned。 但是,如果我正在處理一個字符串,我不能很好地索引一個數組:
char foo[500];
char *ptr = (foo + 4);
*ptr = some_array_that_normalizes_it[*ptr];
您無法在運行時索引具有負數的數組,而不會產生嚴重后果。 保持C字符串無符號可以更容易地防止錯誤。
我真的希望不必每次使用帶有char *的函數時都繼續進行轉換(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成為一個荒謬的課程。
我不是運營商[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);
它不是自動演員,但通過這種方式,您可以輕松而明確地執行此操作。
你提到的兩個編譯器都有“將字符作為無符號”切換。 為什么不使用它?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.