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

Я хочу, чтобы метод сказал мне, что s1 является «char *», а s2 - «char []», как написать метод?Как определить тип const char * и const char [] в коде?

+1

Вы хотите функцию, которая принимает символ char *, но может рассказать вам, как это было объявлено первоначально? Я не думаю, что есть переносной способ сделать это. –

+0

Yeap, там нет портативного способа получить первоначальный тип. Просто небольшой трюк, чтобы получить интуитивный тип. – zsounder

ответ

6

Использование шаблонов:

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)) 
... 

Если интересно, вы можете использовать некоторые предварительные методы, которые расскажут вам на этот раз, как компиляция.

Edit:

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)) 
... 
+1

Разве это не очень вероятно, что первая версия будет встраиваться и const-распространена, так что время компиляции и время выполнения все равно будут одинаковыми? В выведенном двоичном файле. – KillianDS

+0

@KillianDS, для этого конкретного случая вы правы. Но первая версия не может использоваться как часть аргументов 'template', поскольку она не приводит к компиляции-константе. Может быть, с C++ 11 'constexpr', мы могли бы использовать 1-ю версию также как константу времени компиляции. – iammilind

+1

@KillianDS: да, однако, если не указано 'constexpr', первая версия не может использоваться для программирования мета-шаблонов. –

0

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

0

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

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

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

Смежные вопросы