【问题标题】:Global typecast operator overload?全局类型转换运算符重载?
【发布时间】:2012-01-25 16:50:40
【问题描述】:

我正在编写一些“便携式”代码(意味着它针对 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 成为一个荒谬的类)。

【问题讨论】:

  • 您不能编写不涉及至少一种用户定义类型的强制转换(或运算符)
  • 您有使用signed char的旧代码??我非常怀疑...
  • 为什么让 uint8 成为一个可笑的类?这并不比拥有一堆杂散的全局转换函数更可笑。
  • @Kerrek SB:Visual Studio 已经隐式地对 char 进行了签名,除非您使用编译器标志......好吧,因为旧代码开始了。
  • @KerrekSB trilithium.com/johan/2005/01/char-types 。的确,它们是不同的,但包括 Visual C++ 2010 在内的现代编译器默认它们是有符号的,原因在文章中提到。

标签: c++ overloading


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我不太喜欢使用运算符 [ab],但这就是 c++ 的用途吗?

    您可以执行以下操作:

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

    定义了这些,你上面的例子:

    uint32 len2 = strlen(foo2);
    

    会变成

    uint32 len2 = strlen(+foo2); 
    

    这不是自动转换,但通过这种方式,您可以轻松而明确地进行转换。

    【讨论】:

      【解决方案3】:

      您提到的两个编译器都具有“将字符视为无符号”开关。为什么不使用它?

      【讨论】:

      • 破解遗留代码。就像我在...第二句话中所说的那样。
      • 哦...我不确定您的程序的性质。我以为你在写新东西! (就像你在第一句话中所说的)
      猜你喜欢
      • 2011-01-15
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多