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

Quiero un método para decirme que s1 es "char *" y s2 es "char []", ¿cómo escribir el método?¿Cómo identificar el tipo de const char * y const char [] en el código?

+1

¿Desea una función que tenga un carácter * pero que le indique cómo se declaró originalmente? No creo que haya una manera portátil de hacerlo. –

+0

Yeap, no hay una forma portátil de obtener el tipo original. Solo un pequeño truco para obtener el tipo intuitivo. – zsounder

Respuesta

6

Use plantillas:

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

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

Esto evaluar en tiempo de ejecución.
Uso:

if(IsArray(s1)) 
... 

if(IsArray(s2)) 
... 

Si está interesado, puede utilizar algunas técnicas avanzadas, que le dirá esta vez como compilación.

Editar:

typedef char (&yes)[2]; 

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

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

Uso:

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

¿No es muy probable que la primera versión esté en línea y propagada de modo que el tiempo de compilación frente al tiempo de ejecución termine siendo el mismo de todos modos? En binario de salida eso es. – KillianDS

+0

@KillianDS, para este caso en particular, tiene razón. Pero la primera versión no se puede usar como parte de los argumentos de la 'plantilla' ya que no da como resultado la constante de compilación. Puede ser con C++ 11 'constexpr', podríamos usar la primera versión también como constante de tiempo de compilación. – iammilind

+1

@KillianDS: sí, sin embargo, a menos que se marque 'constexpr', la primera versión no se puede usar para la programación de plantillas meta. –

0

Si usted tiene acceso a la definición original, entonces se puede utilizar typeid (pero para qué, no sé). Si no tiene acceso a la definición original ... No hay manera de saber si un char* se inicializó desde otro char*, o desde una matriz.

0

En el contexto anterior (es decir, en el mismo método en el que tenemos la declaración),

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

su compilador no permitiría el paso 1,2,4 pase, mientras que el paso 3 tendría éxito. Esto indica claramente la naturaleza de las variables. Ahora, en lo que respecta al método (función de llamada) para determinar eso, tendrá que tener la definición en la firma del método de todos modos, por lo que no veo ningún propósito/utilidad/posibilidad de este método.

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

ya tiene la definición en el signature.You necesita evitar compilador, para obtener un caso de uso para esto. Pido disculpas, si no he cumplido con su requisito.