我喜欢它,如果有某种的std::istream::read
通用版本,所以我可以这样做:std :: istream :: read的通用形式?
ClassA func(std::istream& is) {
ClassA a;
is.read(a);
return a;
}
或
ClassA func(std::istream& is) {
return is.read<ClassA>();
}
或甚至:
ClassA::ClassA(std::istream& is) {
is.read(data_member);
}
但我总是必须补充我自己的通用定义,如下所示:
template< class T >
void load(T& v, std::istream& is) {
is.read((char*)&v, sizeof(v));
};
template< class T >
T load(std::istream& is) {
T v;
is.read((char*)&v, sizeof(v));
return v;
};
在这样做时,我必须提供流作为参数,当它看起来也许它应该是一个流对象的方法。
load(a.data_member, is);
// vs
is.read(a.data_member);
我,也许我在思考这个问题不正确的感觉或者,也许这是愚蠢的,甚至想这样的事情。我认为当编译器能够一般地推断它时,我必须告诉read()
读取的大小是愚蠢的。
有没有更好的方法?
你想做什么?通过设置一个值到它的内部数据来创建一个对象是一个UB – Geoffroy
我基本上试图使用'std :: istream :: read'而不必传入读取的大小或使用任何明确的强制转换。这里介绍的一个应用程序是从流中读取字节来构造一个对象。 –
你不应该使用C风格转换('(char *)&v'),而是使用C++风格转换:'reinterpret_cast(&v)'。 –
slaphappy