您的位置:首页 > 编程语言 > C语言/C++

[c&cpp]const char* 和const char []在代码中如何识别各自类型

2012-03-09 11:00 323 查看
这是德问技术社区的一个问题,测试了一下,使用typeid等方法都无法正确区分二者,不讨论二者是不是有必要进行区分;

下面给出一个方案吧,其实就是利用了Traits,模板的匹配规则。

template<typenameT>class_ischararray_;

[code]
template<typenameT,intN>

class_ischararray_<T
>{public:staticbool_ischararray(){returntrue;}};


template<typenameT>

class_ischararray_<T*>{public:staticbool_ischararray(){returnfalse;}};


template<classT>

boolisCharArray(constT&x){return_ischararray_<T>::_ischararray();}

[/code]

测试代码:


constchar*s1="12345";

[code]constchars2[]="12345";
isCharArray("12345")?cout<<"char[]"<<endl:cout<<"char*"<<endl;//char[]

isCharArray(s1)?cout<<"char[]"<<endl:cout<<"char*"<<endl;//char*

isCharArray(s2)?cout<<"char[]"<<endl:cout<<"char*"<<endl;//char[]

[/code]

注解:

字符串直接量"12345"输出为char[]的原因:字符串常量的类型应该理解为相应字符常量数组的类型,这一点,从sizeof运算符上可以看出来,sizeof得到的是类型大小信息,sizeof("12345"),得到的大小是6而不是4,因为其类型为constchar[6],如果类型是char*,sizeof的结果应该是4,更多一点的内容可以看一下:

[cpp]字符数组,字符指针,sizeof,strlen总结

CodeOnideone

+2010/3/15,更新一种更好的方式.在SO上发布了这个问题,和iammilind交互得到一个更好的方式:

InnamespaceY,acompiletimesolution,itdoesn'tneedanyexecutioncycles.


namespaceX

[code]{
template<typenameT,unsignedintSIZE>

boolIsArray(T(&a)[SIZE]){returntrue;}


template<typenameT>

boolIsArray(constT*&p){returnfalse;}

}


namespaceY

{

typedefchar(&yes)[2];


template<typenameT,unsignedintSIZE>

yesIsArray(T(&a)[SIZE]);


template<typenameT>

charIsArray(constT*&p);

}



intmain()

{

chars1[]="hello";

constchar*s2="hello";

#if1

usingnamespaceX;

if(true==IsArray(s2))

throw0;

if(false==IsArray("12345"))

throw0;

if(false==IsArray(s1))

throw0;

#else

usingnamespaceY;

if(sizeof(IsArray(s2))==sizeof(yes))

throw0;

if(sizeof(IsArray(s1))!=sizeof(yes))

throw0;

#endif

}

[/code]

CodeOnideone
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐