У меня есть структура, представляющая двоичное сообщение. Я хочу написать функцию, чтобы получить следующую такую запись из буфера (файл или сокет, не имеет значения):
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
. Это возможно?