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?
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?
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))
...
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
@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
@KillianDS: tak, jednak jeśli nie zaznaczono "constexpr", pierwsza wersja nie może być użyta do programowania w szablonie meta. –
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.
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ń.
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. –
Yeap, nie ma przenośnego sposobu na uzyskanie oryginalnego typu. Wystarczy trochę sztuczki, aby uzyskać intuicyjny typ. – zsounder