我喜歡它,如果有某種的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