gpt4 book ai didi

c++ - 如何编写引用 'char *' 或 'const char*' 的 C++ 函数?

转载 作者:行者123 更新时间:2023-12-04 14:02:28 25 4
gpt4 key购买 nike

我正在编写一个函数,一次从字符串中提取一个 unicode 字符。参数是指向 char 的指针的引用,该函数在返回值之前递增到下一个字符。这是整个函数:

uint16_t get_char_and_inc(const char *&c) {
uint16_t val = *c++;
if ((val & 0xC0) == 0xC0)
while ((*c & 0xC0) == 0x80)
val = (val << 8) | *c++;
return val;
}

正如许多人指出的那样,这个 UTF-8 解码器在技术上是不正确的,它仅限于 16 位代码并且不会删除编码位,但对于我有限的微 Controller 图形库来说已经足够了:)

这个函数的复杂度与问题无关,所以简单地假设它是这样的:

uint16_t get_utf8_char_and_inc(const char *&c) {
return *c++;
}

我遇到的问题是我希望它同时适用于 char *const char*,即:

void main() {
const char cc[] = "ab";
get_char_and_inc(cc);
printf(cc);

char c[] = "ab";
get_char_and_inc(c); // This does not compile
printf(c);
}

预期输出:

b
b

然而,第二次调用给我错误:

invalid initialization of non-const reference of type 'const char*&' from an rvalue of type 'const char*'

stackoverflow 上有几个关于此特定错误消息的问题。通常他们认为传递 const char*char *,这是非法的。但在本例中,我将从 char * 转换为 const char*。我觉得这应该是合法的,因为我只是添加了一个保证不修改函数中的数据。

阅读其他答案后,编译器似乎复制了指针,使其成为临时右值。我理解为什么这在非平凡的转换中可能是必要的,但似乎在这里根本没有必要。事实上,如果我从函数签名中删除“&”,它编译得很好,当然,然后指针按值传递,程序打印“ab”而不是“b”。

目前,为了完成这项工作,我必须使用该函数两次,一次采用 const char *&c,另一次采用 char *&c。这对我来说似乎效率低下,因为代码完全相同。有什么办法可以避免重复?

最佳答案

char*const char* 不是同一类型,不能在引用中混用类型,它必须完全匹配。这就是为什么不能传递 char* 指针、char[] 数组或 const char[] 数组等的原因到 const char*& 引用。它们根本不符合预期的类型。

在这种情况下,要使 get_char_and_inc() 成为可以处理多种引用类型的单个函数,请将其设为模板函数,例如:

template<typename T>
uint16_t get_char_and_inc(T* &c) {
return *c++;
}

int main()
{
const char *cc = "ab";
printf("%p\n", cc);
get_char_and_inc(cc); // deduces T = const char
printf("%p\n", cc); // shows cc has been incremented

char c[] = "ab";
char *p = c;
printf("%p\n", p);
get_char_and_inc(p); // deduces T = char
printf("%p\n", p); // shows p has been incremented

return 0;
}

Online Demo

关于c++ - 如何编写引用 'char *' 或 'const char*' 的 C++ 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69562804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com