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

Chcę metody Powiedz mi, że s1 jest "char *", a s2 jest "char []", jak napisać metodę?Jak rozpoznać typ const char * i const char [] w kodzie?

+1

Czy chcesz funkcji, która ma char *, ale może powiedzieć, jak został pierwotnie zadeklarowany? Nie sądzę, żeby był to przenośny sposób. –

+0

Yeap, nie ma przenośnego sposobu na uzyskanie oryginalnego typu. Wystarczy trochę sztuczki, aby uzyskać intuicyjny typ. – zsounder

Odpowiedz

6

Użyj szablony:

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

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

to oceni przy starcie.
Zastosowanie:

if(IsArray(s1)) 
... 

if(IsArray(s2)) 
... 

Jeżeli zainteresowany, można korzystać z niektórych technik wyprzedzeniem, co powie, to jak kompilacji.

Edit:

typedef char (&yes)[2]; 

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

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

Zastosowanie:

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

Czy to nie jest prawdopodobne, że pierwsza wersja będzie inline i propagowana w sposób stały, tak że kompilacja w czasie działania i tak kończy się tak samo? W wyjściowym pliku binarnym. – KillianDS

+0

@KillianDS, W tym konkretnym przypadku masz rację. Ale pierwsza wersja nie może być używana jako część argumentów 'template', ponieważ nie prowadzi do stałej kompilacji. Może być z C++ 11 'constexpr', możemy być w stanie użyć pierwszej wersji również jako stałej czasu kompilacji. – iammilind

+1

@KillianDS: tak, jednak jeśli nie zaznaczono "constexpr", pierwsza wersja nie może być użyta do programowania w szablonie meta. –

0

Jeśli masz dostęp do pierwotnej definicji, a następnie typeid mogą być wykorzystane (ale po co, nie wiem). Jeśli nie masz dostępu do oryginalnej definicji ... Nie ma możliwości sprawdzenia, czy char* został zainicjowany z innego char* lub z tablicy.

0

W powyższym kontekście (który jest w tej samej metody, gdzie mamy deklarację),

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

Twój kompilator nie pozwoli krok 1,2,4 przejść, natomiast etap 3 uda. To wyraźnie wskazuje na naturę zmiennych. Teraz, jeśli chodzi o metodę (wywołanie funkcji), aby to ustalić, musisz mieć definicję w metodzie podpisu tak czy inaczej, więc nie widzę żadnego celu/narzędzia/możliwości tej metody.

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

Masz już definicję w podpisie.Musisz pominąć kompilator, aby uzyskać przypadek użycia dla tego. Przepraszam, jeśli nie spełniłem waszych wymagań.

Powiązane problemy