gpt4 book ai didi

c++ - std::istream::read 的通用形式?

转载 作者:搜寻专家 更新时间:2023-10-31 01:49:07 25 4
gpt4 key购买 nike

如果有某种通用版本的 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() 读取的大小是愚蠢的。

有没有更好的办法?

最佳答案

load 函数没有任何问题,只是记住它只适用于 POD 类型,因此您应该添加:

static_assert(std::is_standard_layout<T>::value, "A must be a POD type.");

此外,请记住在您的流上打开异常,否则您根本不会收到任何错误报告 - 这可能就是为什么流一开始不提供这种读入结构的方式的原因。

关于c++ - std::istream::read 的通用形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16921972/

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