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

std*_*ave 6 c++ overloading

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

typedef unsigned char uint8;
Run Code Online (Sandbox Code Playgroud)

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

char foo[500];
char *ptr = (foo + 4);
*ptr = some_array_that_normalizes_it[*ptr];
Run Code Online (Sandbox Code Playgroud)

您无法在运行时索引具有负数的数组,而不会产生严重后果.保持C字符串无符号可以更容易地防止错误.

我真的希望不必每次使用带有char*的函数时继续进行转换(char*),并且还要停止复制类函数以便它们采用其中之一.这尤其令人痛苦,因为字符串常量隐式传递为char*

int foo = strlen("Hello");  // "Hello" is passed as a char *
Run Code Online (Sandbox Code Playgroud)

我想要所有这些工作:

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
Run Code Online (Sandbox Code Playgroud)

可能需要注意允许这种性质的隐式类型转换,但是,每次使用带有char*而没有强制转换的函数会很好.

所以,我认为像这样的东西会起作用:

operator char* (const uint8* foo) { return (char *)foo; }
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.我无法想办法让它发挥作用.我也找不到任何东西告诉我为什么似乎没有办法做到这一点.我可以看到可能的逻辑 - 像这样的隐式转换可能是导致FAR太多错误的原因 - 但我找不到任何说"这在C++中不起作用"或者为什么,或者如何使其工作(缺少让uin8成为一个荒谬的课程.

Unk*_*987 1

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

您可以执行以下操作:

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

char* operator+(uint8* foo) 
{ 
  return (char *)foo; 
}
Run Code Online (Sandbox Code Playgroud)

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

uint32 len2 = strlen(foo2);
Run Code Online (Sandbox Code Playgroud)

会变成

uint32 len2 = strlen(+foo2); 
Run Code Online (Sandbox Code Playgroud)

它不是自动转换,但这样您就可以轻松而明确地执行此操作。