Могу ли я перегрузить оператор << для типа класса, чтобы создать текстовый и двоичный файл на C ++, имея при этом возможность связать операцию <<? - PullRequest
0 голосов
/ 26 мая 2020

Я хочу перегрузить оператор << в C ++, чтобы создать двоичный и текстовый файл для следующего типа класса.

class data
{
   public :
   int a;
   char b;
}

как я могу перегрузить оператор <<, чтобы создать как двоичный и текстовый файл для этого типа класса, например:

ostream& operator(ostream &out, data &d) //for text
{
   out<<d.a<<' '<<d.b<<'\n';
   return out;
}

and
ostream& operator<<(ostream &out, data &d) //for binary
{
  // code to serialize class data to store it in binary
   return out;
}

проблема в том, что я не могу передать два разных потока (например, ostream& operator<<(ostream& out1, ostream& out2, data& d)) в << одновременно из-за прототипа или способ определения оператора <<, в котором он принимает только один ostream как parameter. Кроме того, поскольку я могу передать только один поток оператору <<, я не смогу связать операцию << для класса как для текстового, так и для двоичного файла одновременно.

1 Ответ

2 голосов
/ 26 мая 2020

Вместо того, чтобы определять operator<< для data, создайте 2 оболочки для представления 2 нужных вам форматов, а затем определите для них operator<<.

class data
{
public:
    int a;
    char b;
};

struct asText
{
    const data &m_data;
    asText(const data &d) : m_data(d) {}
};

struct asBinary
{
    const data &m_data;
    asBinary(const data &d) : m_data(d) {}
};

ostream& operator(ostream &out, const asText &d)
{
    out << d.m_data.a << ' ' << d.m_data.b << '\n';
    return out;
}

ostream& operator<<(ostream &out, const asBinary &d)
{
    // code to serialize d.m_data to store it in binary
    return out;
}

Затем вы можете решить, какой формат, который вы хотите использовать при вызове operator<< для каждого вызова, например:

data d;
...
stream1 << asText(d)
...
stream2 << asBinary(d)
...