const char* s1 = "teststirg";
const char s2[] = "teststirg";
Я хочу, чтобы метод сказал мне, что s1 является «char *», а s2 - «char []», как написать метод?Как определить тип const char * и const char [] в коде?
const char* s1 = "teststirg";
const char s2[] = "teststirg";
Я хочу, чтобы метод сказал мне, что s1 является «char *», а s2 - «char []», как написать метод?Как определить тип const char * и const char [] в коде?
Использование шаблонов:
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))
...
Разве это не очень вероятно, что первая версия будет встраиваться и const-распространена, так что время компиляции и время выполнения все равно будут одинаковыми? В выведенном двоичном файле. – KillianDS
@KillianDS, для этого конкретного случая вы правы. Но первая версия не может использоваться как часть аргументов 'template', поскольку она не приводит к компиляции-константе. Может быть, с C++ 11 'constexpr', мы могли бы использовать 1-ю версию также как константу времени компиляции. – iammilind
@KillianDS: да, однако, если не указано 'constexpr', первая версия не может использоваться для программирования мета-шаблонов. –
Если у вас есть доступ к исходному определению, то typeid
можно использовать (но зачем, я не знаю). Если у вас нет доступа к исходному определению ... Невозможно узнать, был ли инициализирован char*
из другого char*
или из массива.
В приведенном выше контексте (то есть в том же способе, в котором мы имеем заявление),
/*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 нужно обойти компилятор, чтобы получить случай использования для этого. Прошу прощения, если у меня нет правильного требования.
Вы хотите функцию, которая принимает символ char *, но может рассказать вам, как это было объявлено первоначально? Я не думаю, что есть переносной способ сделать это. –
Yeap, там нет портативного способа получить первоначальный тип. Просто небольшой трюк, чтобы получить интуитивный тип. – zsounder