I have some code which takes a packed POD structure/class and copies it into a memory block.
struct A
{
int a;
int b;
} a;
memcpy(mymemoryblock, (void *)&a, sizeof(A));
// later I get a reply and...
memcpy((void *)&a, mymemoryblock, sizeof(A));
This is only valid for POD types of data, and what I would like to know if there is a way I can test for POD-ness. If someone accidentally adds a member function to this class, the memcpy operations become invalid, but still compilable. This leads to very difficult to detect bugs.
Is there a is_POD_type(A) function, or some other trick that can be used to detect PODness at runtime or compile time?
std::is_pod<A>::valuein C++11.[Edit: refer to Luc’s comment above, in C++11 you don’t need the type to be POD for what you’re doing.
For that matter you also don’t need to cast to
void*, and C-style casting pointers tovoid*unnecessarily is a tiny bit risky, because some day you’ll cast awayconstby accident!]In C++03 there’s no standard way to do it, but Boost has its own
is_podthat errs on the side of caution on compilers that don’t provide a non-standard way to find out. So it’s useful if you’re writing code where the POD special case is an optimization (you just won’t get the optimization everywhere). It’s also useful if you only care about compilers for which Boost can get an accurate answer. It’s not so good if false negatives byis_podcause your code to give up in disgust.