如何在代码中识别const char *和const char []的类型?

时间:2012-03-13 07:29:24

标签: c++ arrays c-strings

const char* s1   = "teststirg";  
const char  s2[] = "teststirg";

我想要一个方法告诉我s1是“char *”而s2是“char []”,如何编写方法?

3 个答案:

答案 0 :(得分: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))
...

如果有兴趣,您可以使用一些先进的技术,这将告诉您编译时间。

修改

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 :(得分:0)

如果您可以访问原始定义,则可以使用typeid(但我不知道如何)。如果您无权访问原始定义...无法知道char*是从另一个char*还是从数组初始化的。

答案 2 :(得分: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)

您已经在签名中定义了。您需要绕过编译器,以获得此用例。 我道歉,如果我的要求没有正确的话。