gpt4 book ai didi

c++ - 读取 vector 二进制文件

转载 作者:行者123 更新时间:2023-11-30 05:02:54 25 4
gpt4 key购买 nike

我正在尝试创建一个从二进制文件读取和写入的类。

我的问题是我的模板函数,我需要能够读取一个 vector ,但还要检查它是否是一个类,如果它是一个类,我需要调用类读取,否则只读取 in 文件。

template <class T>
void VecRead(istream& in, T& vector)
{
size_t size = 0;
in.read((char*)&size, sizeof(size));
vector.resize(size);

for (auto &element : vector)
{
// need to check if its a class here
if (Check_If_T_Is_Class_Type)
element.read(in);
else
in.read((char*)&element, sizeof(T));
}
}

class Student
{
public:
string name;
int age;
vector<int> grades;
void read(istream& in)
{
readString(in, name);
in.read((char*)&age, sizeof(int));
VecRead(in, grades);
}
};

class File
{
public:
Header header;
vector<Student> students;
void read(const char* fileName)
{
std::ifstream in(fileName, std::ios::in | std::ios::binary);
header.read(in);
VecRead(in, students);
in.close();
}
};

最佳答案

根据您的尝试,我建议检查 T 是否有正确的方法 read,而不是仅仅检查它是否是一个类。

为了进行此检查,您可以创建一个类来检查 T 是否有任何一种名为 read 的方法,然后检查它的签名。这可以用这样的代码来完成:

template<class CC>
class HasReadFunc
{
template <class C>
static constexpr bool test_( decltype(&C::read) )
{
return std::is_same<
decltype(&C::read),
void(C::*)(istream&)
>::value;
}
template <class C>
static constexpr bool test_(...) { return false; }
public:
static constexpr const bool value = test_<CC>(nullptr);
};

第一个检查是使用 SFINAE 进行的,第二个检查 - 只是 std::is_same

这个类可以像这样使用:

if( HasReadFunc<T>::value ) ...

这确实适用于基本类型。

关于c++ - 读取 vector 二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49622502/

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