ostream operator<< 调用父 ostream
ostream operator<< call parent ostream
代码:
cout << "11122333" << endl;
预计:
11122333\n
结果:
11122333\n
好的。
代码:
cout.operator<<("11122333");
cout.operator<<(endl);
预计:
11122333\n
结果:
00B273F8\n
(或其他一些地址,它被转换为 void*
:( )
麻烦:
想写 class 来自 ostream
class SomeStream : public ostream
{
public:
explicit SomeStream(streambuf* sb) : ostream(sb) { }
template <typename T> SomeStream &operator <<(const T &val)
{
std::ostream::operator<<(val); //Trouble in there!
std::cout << "<<" << " " << typeid(T).name() << " " << val << std::endl;
/*some other behavior*/
return *this;
}
SomeStream &operator <<(ostream& (*val) (ostream&))
{
std::ostream::operator<<(val);
/*some other behavior*/
return *this;
}
SomeStream &operator <<(ios_base& (*val) (ios_base&))
{
std::ostream::operator<<(val);
/*some other behavior*/
return *this;
}
};
当我调用父运算符 std::ostream::operator<<(val);
时,val 转换为 void*
而不是正常工作。
怎么做才对?以及为什么 ostream
的直接调用 operator<<
与间接调用不同。
const char*
的输出 operator <<
不是类型 ostream
的成员。
Only those重载是成员函数,其中之一是for void*
。
还有non-member overloads.
有解决方法:
template <typename T> SomeStream &operator <<(const T &val)
{
static_cast<std::ostream&>(*this) << val; //Trouble in there!
std::cout << "<<" << " " << typeid(T).name() << " " << val << std::endl;
/*some other behavior*/
return *this;
}
代码:
cout << "11122333" << endl;
预计:
11122333\n
结果:
11122333\n
好的。
代码:
cout.operator<<("11122333");
cout.operator<<(endl);
预计:
11122333\n
结果:
00B273F8\n
(或其他一些地址,它被转换为 void*
:( )
麻烦:
想写 class 来自 ostream
class SomeStream : public ostream
{
public:
explicit SomeStream(streambuf* sb) : ostream(sb) { }
template <typename T> SomeStream &operator <<(const T &val)
{
std::ostream::operator<<(val); //Trouble in there!
std::cout << "<<" << " " << typeid(T).name() << " " << val << std::endl;
/*some other behavior*/
return *this;
}
SomeStream &operator <<(ostream& (*val) (ostream&))
{
std::ostream::operator<<(val);
/*some other behavior*/
return *this;
}
SomeStream &operator <<(ios_base& (*val) (ios_base&))
{
std::ostream::operator<<(val);
/*some other behavior*/
return *this;
}
};
当我调用父运算符 std::ostream::operator<<(val);
时,val 转换为 void*
而不是正常工作。
怎么做才对?以及为什么 ostream
的直接调用 operator<<
与间接调用不同。
const char*
的输出 operator <<
不是类型 ostream
的成员。
Only those重载是成员函数,其中之一是for void*
。
还有non-member overloads.
有解决方法:
template <typename T> SomeStream &operator <<(const T &val)
{
static_cast<std::ostream&>(*this) << val; //Trouble in there!
std::cout << "<<" << " " << typeid(T).name() << " " << val << std::endl;
/*some other behavior*/
return *this;
}