存在这样的函数:
std::ostream& operator<< (std::ostream &out, const boost::dynamic_bitset<> &v) {
for (unsigned i = 0; i < v.size(); ++i) {
out << int(v[i]);
}
return out;
}
希望覆盖它并使用类似的东西。 :)
std::ostream& operator<< (std::ostream &out, const boost::dynamic_bitset<> &v) {
for (unsigned i = 0; i < v.size(); ++i) {
if (i && v[i]) {
out << ", " << i;
}
}
return out;
}
显然C ++不会允许这样做。你是如何克服这个并使用替代日志记录功能的?
答案 0 :(得分:4)
与@ Bathseba的(正确)答案相反,我会避免从类继承:它永远不会真正微不足道,因为你可能需要几个ctors,你可能希望在不同的设置中有不同的重定向,可能是你想要专门化的其他操作(比如这里的重定向),等等。
相反,我会创建一个仅用于重定向的类:
struct my_redirector
{
my_redirector(const whatever &w) : m_w(w) {}
const whatever &m_w;
};
std::ostream &operator<<(std::ostream &&os, const my_redirector &r)
{
// whatever you want
return os;
}
你将用作:
whatever w;
cout << my_redirector(w) << endl;
代码足够短,以便一目了然地看到你创建这个类的原因。
答案 1 :(得分:2)
从boost类中继承,确保v属于该类型,并定义相关的运算符。
不幸的是,C ++并不允许你取消定义一个函数。