2012-03-13 16 views
5
const char* s1 = "teststirg"; 
const char s2[] = "teststirg"; 

Voglio un metodo mi dica che s1 è "char *" e s2 è "char []", come scrivere il metodo?Come identificare il tipo di const char * e const char [] nel codice?

+1

Vuoi una funzione che accetta un carattere * ma può dirti come è stato dichiarato in origine? Non penso che ci sia un modo portatile per farlo. –

+0

Yeap, non c'è un modo portatile per ottenere il tipo originale. Basta un piccolo trucco per ottenere il tipo intuitivo. – zsounder

risposta

6

Utilizzare i modelli:

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

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

Questo valuterà in fase di esecuzione.
Uso:

if(IsArray(s1)) 
... 

if(IsArray(s2)) 
... 

Se interessati, è possibile utilizzare alcune tecniche di anticipo, che vi dirà questa volta come compilazione.

Edit:

typedef char (&yes)[2]; 

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

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

Usage:

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

Non è molto probabile che la prima versione sia inline e cost-propagated in modo che il tempo di esecuzione vs tempo di compilazione finisca per essere lo stesso comunque? In binario emesso che è. – KillianDS

+0

@ KillianDS, Per questo caso particolare hai ragione. Ma la prima versione non può essere usata come parte degli argomenti di 'template' in quanto non risulta in una costante di compilazione. Potrebbe essere con C++ 11 'constexpr', potremmo essere in grado di utilizzare la prima versione anche come costante di tempo di compilazione. – iammilind

+1

@KillianDS: sì, a meno che non sia indicato 'constexpr', la prima versione non può essere utilizzata per la programmazione di meta template. –

0

Se si ha accesso alla definizione originale, quindi typeid può essere usato (ma per che cosa, non so). Se non si ha accesso alla definizione originale ... Non è possibile sapere se un char* è stato inizializzato da un altro char* o da un array.

0

Nel contesto di cui sopra (cioè nello stesso metodo in cui abbiamo la dichiarazione),

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

il compilatore non permetterebbe passo 1,2,4 per passare, mentre il passaggio 3 avrebbe avuto successo. Questo indica chiaramente la natura delle variabili. Ora, per quanto riguarda il metodo (chiamata di funzione) per determinarlo, si dovrà comunque avere la definizione nella firma del metodo, quindi non vedo alcuno scopo/utilità/possibilità di questo metodo.

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

hai già la definizione della signature.You bisogno di bypassare il compilatore, per ottenere un caso d'uso per questo. Mi scuso, se non ho avuto il tuo requisito corretto.

Problemi correlati