[c&cpp]const char* 和const char []在代码中如何识别各自类型
2012-03-09 11:00
323 查看
这是德问技术社区的一个问题,测试了一下,使用typeid等方法都无法正确区分二者,不讨论二者是不是有必要进行区分;
下面给出一个方案吧,其实就是利用了Traits,模板的匹配规则。
[code]
[/code]
测试代码:
[code]constchars2[]="12345";
[/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.
[code]{
[/code]
CodeOnideone
下面给出一个方案吧,其实就是利用了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,更多一点的内容可以看一下:
+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]
相关文章推荐
- IntelliSense: "const char *" 类型的实参与 "LPCTSTR" 类型的形参不兼容 (vs2010)
- VS2013 中IntelliSense: "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容
- 不能将 "const char *" 类型的值分配到 "LPCWSTR" 类型的实体 错误解决方法
- VC++ 出现错误:cannot convert from const char *' to 'LPCWSTR' 或者'const char [7]' to 'LPCWSTR' 的解决方法
- 类型转换 -- 使用Unicode下的cannot convert parameter 1 from 'CString' to 'const char *' 解决办法
- 二进制“<<”: 没有找到接受“const std::basic_string<char,std::char_traits<char>,std::allocator<char>>”类型的右操作数的运算
- 不能将类型为‘std::string&’的非 const 引用初始化为类型为‘const char*’的临时变量
- "const char *" 类型的实参与 "LPCTSTR" 类型的形参不兼容
- IntelliSense: "const char *" 类型的实参与 "LPCTSTR" 类型的形参不兼容 (vs2012)
- const char*和const char[]怎么识别?
- 如何对const TDesC&数据类型进行Trim
- 关于“Error: "const char *" 类型的实参与 "LPCWSTR"类型的形参不兼容”错误的解决方案
- C++类中各种不同类型成员根据是否static 、是否const类型的初始化方法不尽相同,写代码时经常搞乱,网上搜了一下资料,全部总结一下。一、例子 [cpp] view plaincopy ---
- IntelliSense: "const char *" 类型的实参与 "LPCTSTR" 类型的形参不兼容 (vs2010)
- 托管类型转换:const char* && string && String^ 类型转换
- "const char*"类型的实参与LPCTSTR类型的形参不兼容
- vs2013 IntelliSense: "const char *" 类型的实參与 "LPCWSTR" 类型的形參不兼容
- IntelliSense: "const char *" 类型的实参与 "LPCTSTR" 类型的形参不兼容
- vs2013 IntelliSense: "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容
- 不能将"constchar*"类型的值分配到"LPCWSTR"类型的实体错误解决方法