C++-const char* 和const char []在代码中如何识别各自类型。

C++-const char* 和const char []在代码中如何识别各自类型。

泛泛之交 发布于 2017-09-22 字数 108 浏览 1126 回复 3

const char* a="12345"; const char b[]="12345"; 怎么在代码里知道一个是const char*一个是const char []。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

瑾兮 2017-10-28 3 楼

template<typename T> class _ischararray_;

template<typename T, int N> class _ischararray_<T[N]>
{
public: static bool _ischararray(){return true;}
};

template<typename T> class _ischararray_<T*>
{
public: static bool _ischararray(){return false;}
};

template<class T> bool isCharArray(const T& x)
{
return _ischararray_<T>::_ischararray();
}

看一下traits和模板匹配.

测试代码:

const char* s1 = "12345";
const char s2[] = "12345";
isCharArray("12345")?cout<<"char []"<<endl:cout<<"char*"<<endl;
isCharArray(s1)?cout<<"char []"<<endl:cout<<"char*"<<endl;
isCharArray(s2)?cout<<"char []"<<endl:cout<<"char*"<<endl;

更新一种更好的方式,在编译期间解决这个问题,来自SO的iammilind.

 namespace X
{
template<typename T, unsigned int SIZE>
bool IsArray (T (&a)[SIZE]) { return true; }

template<typename T>
bool IsArray (const T *&p) { return false; }
}

namespace Y
{
typedef char (&yes)[2];

template<typename T, unsigned int SIZE>
yes IsArray (T (&a)[SIZE]);

template<typename T>
char IsArray (const T *&p);
}

int main ()
{
char s1[] = "hello";
const char *s2 = "hello";
#if 1
using namespace X;
if(true == IsArray(s2))
throw 0;
if(false == IsArray("12345"))
throw 0;
if(false == IsArray(s1))
throw 0;
#else
// 编译期间解决该问题
using namespace Y;
if(sizeof(IsArray(s2)) == sizeof(yes))
throw 0;
if(sizeof(IsArray(s1)) != sizeof(yes))
throw 0;
#endif
}

Code On ideone

清晨说ぺ晚安 2017-10-16 1 楼

用typeid来判断返回的结果都是:char const *,是同一种类型,但是sizeof(a)=4(指针),sizeof(b)=6,根据sizeof大小来判断大部分情况下是可行的。参考:typeid详解