如何解决禁用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
名称空间中定义的输出运算符的名称...
解决方法
如果未注释cout的第二个和/或第三个输出,则会在g ++中产生编译错误:
#include <iostream>
using namespace std;
ostream & operator << ( const ostream &,void * ) {
}
int main() {
int n = 0;
cout << 0;
// cout << &n;
// cout << (void *) 0;
}
,全局模板版本operator<<
似乎有效:
#include <iostream>
#include <boost/static_assert.hpp>
template<typename T>
std::ostream & operator<<(std::ostream & stream,T* value) {
BOOST_STATIC_ASSERT(false);
}
int main() {
int foo = 5;
int * bar = &foo;
std::cout << bar << std::endl;
}
编辑:此解决方案无法按预期工作,因为模板还捕获字符串文字。您应该首选@Neil \的解决方案。
,是的,您可以通过提供您自己的ostream \运算符<<的重载来引起编译错误。
#include <iostream>
template <typename T>
std::ostream& operator << (std::ostream& s,T* p)
{
char ASSERT_FAILED_CANNOT_OUTPUT_POINTER[sizeof(p) - sizeof(p)];
}
int main()
{
int x;
int* p = &x;
cout << p;
}
,请勿将ѭ7用作指针。
template<typename T>
std::ostream& operator<<(std::ostream &stream,T* value);
编辑:或者最好放置一个无效的类型名来获取编译器错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。