全局类型转换运算符超载?

时间:2011-12-21 22:26:04

标签: c++ overloading

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

typedef unsigned char uint8;

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

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成为一个荒谬的课程。)

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

我不是运营商[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); 

它不是自动演员,但这样你就可以轻松而明确地进行演绎。

答案 2 :(得分:0)

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