gpt4 book ai didi

c++ - 在其第一个参数中重载二进制移位运算符

转载 作者:太空宇宙 更新时间:2023-11-04 14:04:34 26 4
gpt4 key购买 nike

我想创建一个自定义的文件流类,我可以用它来打印和读取格式化(文本)和未格式化(二进制)数据。移位运算符(<< 和 >>)以及文件流的写入和读取成员已经存在,但我只想使用移位运算符 <<,如果以二进制模式打开流,则创建无格式输出,并且否则格式化。

我写的代码至少对于字符串和字符(和 cstrings)不能正常工作:

class mixstream:public fstream {

public:

//some constructors and public functions in the code

template <class T> mixstream& operator<< (T&& param)
{
if (openmode() & ios_base::binary)
write((char *) &param, sizeof(param)); //binary write-out

else
fstream::operator<<(param); //non-binary write out

return *this;
}

template <class T> mixstream& operator>> (T&& param)
{
if (openmode() & ios_base::binary)
read((char *) &param, sizeof(param)); //binary read-in

else
fstream::operator>>param; //non-binary read-in

return *this;
}
};

问题可能出在 ostream's shift operator 附近,这样 ostream 的 << 和 >> 运算符就不会因字符、cstring 和字符串而重载。

您能指出我应该在哪里修改我的代码以及我应该将什么替换成什么吗?

如果您为我的目的提供建议并展示良好实践,我也将不胜感激,因此也接受变通办法 - 如果它们优雅的话。

最佳答案

基于另一个题为“Problem with overriding “operator<<” in class derived from “ostream””的 SO 问题,我可以实现我的目标。

  1. 正如 Johannes Schaub - litb 在上面的链接中建议的那样,我不将移位运算符用作成员函数,而是将其用作自由函数。因此,我必须定义一个类的新成员,用于存储文件是否以二进制模式打开。
  2. 移动语义似乎是必要的。否则,string、char 和 cstring 输出将无法正常工作(至少,工作方式与预期不同 :))。
  3. UncleBens 对调整的回答看起来不错。

首先,定义类:

class mixstream:public fstream
{
bool binmode;

public:
//constructors
explicit mixstream() {};

explicit mixstream ( const char * filename, ios_base::openmode mode = ios_base::in | ios_base::out) :
fstream(filename, mode)
{
if (mode & ios_base::binary)
binmode = true;

else
binmode = false;

};

void open(const char *_Filename, ios_base::openmode _Mode = ios_base::in | ios_base::out, int _Prot = (int)ios_base::_Openprot)
{
fstream::open (_Filename, _Mode, _Prot);

if (_Mode & ios_base::binary)
binmode = true;

else
binmode = false;

}

bool get_binmode() const {return binmode;}
}

然后定义重载的插入和提取运算符:

template <class T> mixstream& operator<< (mixstream& stream, const T&& param)
{
if (stream.get_binmode())
stream.write((char *) &param, sizeof(param));

else
(fstream&)stream << param;

return stream;
}

template <class T> mixstream& operator>> (mixstream& stream, const T&& param)
{
if (stream.get_binmode())
read((char *) &param, sizeof(param));

else
ostream::operator>>param;

return *this;
}

然后我可以使用我的新流形式:

int main(int argc, char *argv[]) {

mixstream bin_or_not;
if (true) //some condition
bin_or_not.open("file.dat",ios_base::out | ios_base::binary);

else
bin_or_not.open("file.dat",ios_base::out);


char testcs[] = "testsc";
string tests("tests");
int testn = 10;

bin_or_not << 10 << testn << "testcs" << testcs << tests;

return 0;
}

仍然欢迎评论和回答作为改进建议。

关于c++ - 在其第一个参数中重载二进制移位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17626484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com