微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

禁用C ++流中的指针输出?

如何解决禁用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 举报,一经查实,本站将立刻删除。