0

我有一个自定义输出类,它有两个std::ostream用于不同目的的成员。根据输出类的配置方式使用任一流。在某些情况下,两个流被链接在一起。下面是该类的一个非常简化的版本。如果需要,我可以提供更多细节。

class c_Output
{
  public:
    c_Output (bool x_useA) : m_useA(x_useA) { /* setup m_stream[AB] here */ };
    ~c_Output ();
    inline std::ostream& stream () { return (m_useA ? m_streamA : m_streamB); };

  private:
    bool m_useA;
    std::ostream m_streamA;
    std::ostream m_streamB;
}

我知道如何为我希望流向/从std::coutstd::cin或任何其他类的类编写流运算符std::iostream,但我正在努力编写流运算符,其中一个c_Output实例用作 lhs 而不是std::ostream实例。

现在,我能够逃脱:

c_Output l_output;
uint64_t l_value = 0xc001c0de;
l_output.stream() << std::hex << std::setw(16) << std::setfill('0') << l_value;

c_Output::stream()返回适当的std::ostream&,因此其行为与预期的一样。

我想将上面的内容重写为:

c_Output l_output;
uint64_t l_value = 0xc001c0de;
l_output << std::hex << std::setw(16) << std::setfill('0') << l_value;

根据我在 StackOverflow 和更大的网络上看到的示例,我尝试了几种不同版本的定义operator<<,但无济于事。最新版本如下所示:

// in header
class c_Output
{
    ...
    friend c_Output& operator<< (c_Output& x_output, std::ostream& x_stream);
    ...
}

// in source
c_Output&
operator<< (c_Output& x_output, std::ostream& x_stream)
{
    x_output.stream() << x_stream;
    return x_output;
}

参数的设置旨在反映标准流运算符重载。此设置给了我编译问题,例如:

error: no match for 'operator<<' in 'l_output << std::hex'
note: candidates are: c_Output& operator<<(c_Output&, std::ostream&)

我已经剥离了所有文件和行信息,但它明白了这一点。我显然得到了运算符 rhs 的类型不正确。根据需要实现流运算符的正确类型和/或正确方法是什么?

还有一个c_Input具有类似要求的补充类,但调整答案c_Output应该是微不足道的。

4

2 回答 2

0
operator<< (c_Output& x_output, std::ostream& x_stream)

唯一真正的问题是它std::hex不是 a std::ostream,并且您的方法没有重载<<可用。

为了支持hex修饰符的使用,您将需要另一个friend带参数的重载(c_Output&, ios_base& (*)(ios_base&))(如hex指向函数的指针,该函数引用ios_base返回对 的引用ios_base)。

按照您的进度,您还需要实现所有其他<<重载。这不是一项微不足道的任务,但有必要伪装成std::ostream,无论是否继承它。

于 2013-05-03T04:02:22.620 回答
0

std::hex的类型是std::ios_base& (*)(std::ios_base&). 将您的操作员签名更改为:

c_Output& operator<< (c_Output& x_output, std::ios_base& (*x_stream)(std::ios_base&));
于 2013-05-03T03:40:44.090 回答