取代现有运算符<<:覆盖现有实现

时间:2016-01-19 17:42:59

标签: c++

存在这样的函数:

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 ++不会允许这样做。你是如何克服这个并使用替代日志记录功能的?

2 个答案:

答案 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 ++并不允许你取消定义一个函数。