Как определить тип const char * и const char [] в коде? - PullRequest
5 голосов
/ 13 марта 2012
const char* s1   = "teststirg";  
const char  s2[] = "teststirg";

Я хочу, чтобы метод сказал мне, что s1 это "char *", а s2 это "char []", как написать метод?

Ответы [ 3 ]

6 голосов
/ 13 марта 2012

Использовать шаблоны:

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))
...
0 голосов
/ 13 марта 2012

В приведенном выше контексте (то есть в том же методе, в котором мы имеем объявление),

   /*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)

У вас уже есть определение в подписи. Вам нужно обойти компилятор, чтобы получить вариант использования для этого. Прошу прощения, если я не правильно выполнил ваше требование.

0 голосов
/ 13 марта 2012

Если у вас есть доступ к исходному определению, тогда можно использовать typeid (но зачем, я не знаю).Если у вас нет доступа к исходному определению ... Нет способа узнать, был ли инициализирован char* из другого char* или из массива.

...