gpt4 book ai didi

c++ - 全局类型转换运算符重载?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:47 27 4
gpt4 key购买 nike

我正在编写一些“可移植”代码(意味着它针对 Linux 上的 32 位和 64 位 MSVC2k10 和 GCC),其中我或多或少有:

typedef unsigned char uint8;

C 字符串总是 uint8;这是出于字符串处理的原因。遗留代码需要将 char 编译为带符号的,所以我无法将编译器开关设置为默认为无符号。但是如果我正在处理一个字符串,我就不能很好地索引一个数组:

char foo[500];
char *ptr = (foo + 4);
*ptr = some_array_that_normalizes_it[*ptr];

你不能在运行时索引一个带有负数的数组而不会有严重的后果。保持 C 字符串未签名可以更轻松地防止错误。

我真的很想不必在每次使用采用 char * 的函数时都强制转换 (char *),并且也停止复制类函数以便它们采用其中之一。这尤其痛苦,因为字符串常量作为 char *

隐式传递
int foo = strlen("Hello");  // "Hello" is passed as a char *

我希望所有这些都能正常工作:

char foo[500] = "Hello!";   // Works
uint8 foo2[500] = "Hello!"; // Works
uint32 len = strlen(foo); // Works
uint32 len2 = strlen(foo2); // Doesn't work
uint32 len3 = strlen((char *)foo2); // Works

允许这种性质的隐式类型转换可能有一些注意事项,但是,最好使用每次都采用 char * 而无需强制转换的函数。

所以,我认为这样的事情会起作用:

operator char* (const uint8* foo) { return (char *)foo; }

然而事实并非如此。我想不出任何办法让它发挥作用。我也找不到任何东西可以告诉我为什么似乎没有办法做到这一点。我可以看到可能的逻辑——像这样的隐式转换可能是 FAR 太多错误的原因——但我找不到任何说“这在 C++ 中不起作用”或为什么,或如何让它起作用的东西(缺少使 uin8 成为一个荒谬的类)。

最佳答案

全局转换(类型转换)运算符、全局赋值运算符、全局数组下标运算符和全局函数调用运算符重载在 C++ 中是不允许的

MSVS C++ 将生成 C2801 errors在他们。 Look at wiki获取 C++ 运算符列表及其重载规则。

关于c++ - 全局类型转换运算符重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8597222/

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