Отключение вывода указателя в потоках C ++?

Если вы передадите какой-либо указатель на поток 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"

Это может быть проблемой, если пользователь по ошибке пытался напечатать значение FooType.

И это также проблема при смешивании широкого и узкого символов, потому что вместо ошибки компилятора вы получите адрес напечатанный:

const wchar_t* str = L"Test! (Wide)";
// ...
cout << str << "\n"; // Ooops! Prints address of str.

Так что мне было интересно - поскольку я очень редко хочу выводить значение указателя , можно ли было бы отключить форматирование значений указателя, чтобы вставка значения указателя в поток приводила к ошибке компилятора? (Вывод значений указателя может быть легко достигнут с помощью типа оболочки или приведение значений указателя к size_t или чему-то подобному.)

Изменить: В свете ответа Нила (отключение вывода void * путем предоставления моего собственного оператора вывода void *) я хотел бы добавить, что было бы неплохо, если бы это также работало для таких инструментов, как Boost.Format, которые неявно используют оператор вывода, определенный в пространстве имен std ...

8
задан Community 23 May 2017 в 12:04
поделиться