У меня есть структура, представляющая двоичное сообщение. Я хочу написать функцию, чтобы получить следующую такую запись из буфера (будь то файл или сокет, не имеет значения):
template <typename Record>
Record getNext();
Теперь я мог бы написать это как:
template <typename Record>
Record getNext() {
Record r;
populateNext(reinterpret_cast<char*>(&r), // maybe ::read()
sizeof(r)); // or equivalent
return r;
}
что приятно и дает мне преимущества RVO. Однако он будет ссылаться на конструктор по умолчанию Record
, который может состоять из типов с нетривальными конструкторами по умолчанию, которые работают, чего я бы хотел избежать - это не обязательно типы POD, но они являются стандартными.
Есть ли способ написать getNext()
так, чтобы мы избегали каких-либо конструкторов (по умолчанию или копирование/перемещение) на Record
? В идеале, когда пользователь вызывает:
auto record = getNext<Record>();
Буфер считывается непосредственно в память Record
. Это возможно?