簡體   English   中英

如何在代碼中識別const char *和const char []的類型?

[英]How to identify the type of const char* and const char[] in code?

const char* s1   = "teststirg";  
const char  s2[] = "teststirg";

我想要一個方法告訴我s1是“ char *”而s2是“ char []”,如何編寫該方法?

使用模板:

template<typename T, unsigned int SIZE>
bool IsArray (T (&a)[SIZE]) { return true; }

template<typename T>
bool IsArray (T *p) { return false; }

這將在運行時評估。
用法:

if(IsArray(s1))
...

if(IsArray(s2))
...

如果有興趣,您可以使用一些高級技巧,這些技巧將在編譯時告訴您。

編輯

typedef char (&yes)[2];

template<typename T, unsigned int SIZE>
yes IsArray (T (&a)[SIZE]);

template<typename T>
char IsArray (T *p);

用法:

if(sizeof(IsArray(s1)) == sizeof(yes))
...
if(sizeof(IsArray(s2)) == sizeof(yes))
...

如果您有權訪問原始定義,則可以使用typeid (但是我不知道該做什么)。 如果您無權訪問原始定義,則無法知道char*是從另一個char*還是從數組初始化的。

在上述情況下(即使用聲明的相同方法),

   /*1*/ s1[0]='\0';
   /*2*/ s2=s1;
   /*3 Only This is valid*/  s1=s2;
   /*4*/  s2[0]='\0';

您的編譯器不允許步驟1,2,4通過,而步驟3將成功。 這清楚地表明了變量的性質。 現在,關於確定方法(函數調用),無論如何,您都必須在方法簽名中具有定義,因此我看不到該方法的任何用途/用途/可能性。

determiner (const char* s1,const char *const s2)

簽名中已經有了定義。您需要繞過編譯器,以獲取用例。 抱歉,如果我對您的要求不正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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