Si pasa cualquier puntero a una secuencia C++, su dirección se colocará en la salida. (Obviamente, a menos que haya un gestor de salida más específico.)¿Desactivar la salida del puntero en flujos de C++?
void* px = NULL;
const char* ps = "Test";
FooType* pf = ...;
stringstream s;
s << ps << " " << px << " " << pf "\n";
s.str(); // yields, for example: "Test 0 AF120089"
Esto puede ser un problema, si el usuario erróneamente estaba tratando de imprimir realmente el valor de FooType.
Y también es un problema cuando se mezcla todo el carbón de leña y carbón estrecha, porque en lugar de un error de compilación, obtendrá la dirección impresa:
const wchar_t* str = L"Test! (Wide)";
// ...
cout << str << "\n"; // Ooops! Prints address of str.
así que me preguntaba - ya que muy raramente quiero para generar un valor de puntero, ¿sería posible deshabilitar el formato de los valores del puntero, de modo que insertar un valor de puntero en una secuencia daría lugar a un error del compilador? (Salida de los valores del puntero podría entonces lograrse fácilmente mediante el uso de un tipo de envoltorio o lanzar los valores del puntero a size_t o algo por el estilo.)
Editar: A la luz de Neil's answer (incapacitante void * salida al proporcionar mi propia void * operador de salida) Me gustaría añadir que sería bueno si esto también funcionó para herramientas como Boost.Format, que hacen un uso implícito del operador de salida definido en el espacio de nombres std
...
Hmmm ... esto se ve bien. El operador de salida void * "normal" se define en el espacio de nombres std, ¿no? Entonces, si hay un código que usa el de std, ¿esto no ayudará ...? –
Algo funciona, pero formalmente no se permite sobrecargar operadores sin al menos un tipo de parámetro definido por el usuario. –
@Bo ¿Y qué crees que es ostream? –