簡體   English   中英

全局類型轉換運算符超載?

[英]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成為一個荒謬的課程。

C ++中不允許使用全局轉換(類型轉換)運算符 ,全局賦值運算符,全局數組下標運算符和全局函數調用運算符重載。

MSVS C ++將在它們上生成C2801錯誤 查看wiki以獲取C ++運算符列表以及它們重載規則。

我不是運營商[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM