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

我想要一个方法告诉我s1是“char*”,s2是“char[]”,这个方法怎么写?

4

3 回答 3

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))
...
于 2012-03-13T07:35:10.307 回答
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)

您已经在签名中有定义。您需要绕过编译器,才能获得一个用例。抱歉,如果我没有正确地满足您的要求。

于 2012-03-13T11:06:17.340 回答
0

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

于 2012-03-13T08:21:43.680 回答