У меня есть эта шаблонная функция
template <typename T, typename It, std::enable_if_t<std::is_integral<T>::value, int> = 0>
inline T decode(It &it) {
static_assert(std::is_same<typename std::iterator_traits<It>::value_type, std::uint8_t>::value, "invalid");
T* v_p = reinterpret_cast<T*>(&*it);
it += sizeof(T);
return *v_p;
}
, которая используется для декодирования целых чисел из необработанного указателя. Функцию можно использовать с любым типом, имеющим черты итератора, то есть либо указатели на std::uint8_t
, либо итераторы на std::uint8_t
контейнеры STL с итераторами, которые удовлетворяют LegacyContiguousIterator требованиям.
Функция работает , но я не уверен насчет производительности вызова &*it
, когда it
является указателем. Операторы необходимы для получения указателя от итератора, как объяснено в этом ответе , но для указателей POD это кажется излишним. Разрешено ли компилятору просто отбрасывать операции или лучше написать специализацию для указателей