Шаблон должен хорошо работать:
#include <algorithm>
template <typename T>
T read_and_advance(const unsigned char * & p)
{
T x;
unsigned char * const px = reinterpret_cast<unsigned char *>(&x);
std::copy(p, p + sizeof(T), px);
P += sizeof(T);
return x;
}
Использование:
const unsigned char * p = the_data;
unsigned int max = 0;
while (p != the_data + data_length)
{
max = std::max(max, read_and_advance<unsigned int>(p));
}
Отбрось это, я думал, первоначально вопрос был для C.
Вот макрос:
#define READ_TYPE(T, buf, res) do { memcpy(&res, buf, sizeof(T)); buf += sizeof(T); } while (false)
Использование:
int max = 0;
unsigned char * p = data;
while (true)
{
unsigned int res;
READ_TYPE(unsigned int, p, res);
if (res > max) max = res;
}
На самом деле вы не можете обойтись без указания типа , хотя.В C ++ это можно сделать немного более элегантно.
В качестве альтернативы вы можете обернуть все это в один:
#define READ_TYPE_AND_MAX(T, buf, max) \
do { T x; memcpy(&x, buf, sizeof(T)); \
buf += sizeof(T); \
if (max < x) max = x; \
} while (false)
// Usage:
unsigned int max = 0;
unsigned char * p = data;
while (true) { READ_TYPE_AND_MAX(unsigned int, p, max); }