如何在代码中识别 const char* 和 const char[] 的类型
How to identify the type of const char* and const char[] in code?
const char* s1 = "teststirg";
const char s2[] = "teststirg";
我想要一个方法告诉我 s1 是"char*",s2 是"char[]",如何编写方法?
使用模板:
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))
...
如果您可以访问原始定义,则可以使用typeid
(但我不知道是为了什么(。 如果您无权访问原始定义... 无法知道char*
是从另一个char*
还是从数组初始化的。
在上面的上下文中(这与我们有声明的方法相同(,
/*1*/ s1[0]=' ';
/*2*/ s2=s1;
/*3 Only This is valid*/ s1=s2;
/*4*/ s2[0]=' ';
编译器不允许步骤 1、2、4 通过,而步骤 3 会成功。这清楚地表明了变量的性质。现在,关于确定的方法(函数调用(,无论如何您都必须在方法签名中具有定义,因此我看不到此方法的任何目的/实用程序/可能性。
determiner (const char* s1,const char *const s2)
签名中已有定义。您需要绕过编译器才能获得用例。很抱歉,如果我没有正确满足您的要求。
相关文章:
- 在字符串函数中抛出'char const*'实例后调用的终止
- 双重标准?为什么只有 char* const&a = "bla" 的警告?
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 为什么 const char* const & = 可以编译"hello"?
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何将std::wstring转换为char const[]
- "char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {"剂量是什么意思
- 使用提升对字符串进行标记化时,将令牌转换为 char* const* 时失败
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 将 std::vector<std::string> 转换为 const char* const*
- 引发"char const*"错误的实例后调用的终止
- 将const char * const参数成员分配给新值
- 从'const char**'到'char* const*'的转换无效
- 从 sub_match<常量字符 *>' 转换为'const char *const &'
- char*const和constchar*之间有什么区别?(重复-需要更多澄清)
- 使用工厂方法时编译器错误:无法转换"const std::p air<char* const
- HEVC 解码器端口 Android 警告:从 'signed char*' 到 'char const* 的转换无效*
- 如何从'char const*'中删除常量
- 'char const *str'作为模板参数
- 为什么不;t strlen(.)应为const char*const str,而不是const char*