Re: Compile-time introspection
* Dave Rahardja:
Is there a way to generate a series of statements based on the data members of
a structure at compile time?
I have a function that reverses the endianness of any data structure:
/// Reverse the endianness of a data structure "in place".
template <typename T>
void reverseEndian(T&);
Using boost, it is possible to provide the default implementation for all POD
types (i.e. simply reverse the bytes in the data item's representation).
Until today, I have purposely not provided the implementation for structures,
forcing the user of the function to provide an implementation for each
structure, for example:
struct S
{
int a;
float b;
double c;
};
template <> void reverseEndian(S& s)
{
// Function body -- can this be automated?
reverseEndian<>(s.a);
reverseEndian<>(s.b);
reverseEndian<>(s.c);
}
Is it possible to automatically generate the contents of the specialization?
This calls for introspection (the language feature, not the Zen philosophy),
and so far I have not found any way to do it, portable or otherwise.
No, you can't do what you want directly, at least as of the current
standard.
But yes, there other ways.
One way is to note that if you could serialize and deserialize the
object, then you could do the processing in between those two steps. So
your problem is essentially equivalent to the serialization problem,
suggesting you look at Boost facilities for serialization, and require
"serializability" for the classes. Or even simpler, require "dumb
serialization" support: dump fields into vector, read 'em back from a
vector. After all you don't need more.
Another way is to do code generation. Of course that's also one
approach to serialization, for the same reasons. I regret to say that I
don't know very much about current tools, except that I think there's a
more or less complete C++ parser at SourgeForge (you could look into
building your own e.g. using Boost Phoenix, but it's a daunting task!).
What I can tell you of direct experience is that the g++ source code,
otherwise a natural starting point for build-your-own, is very complex.
And it's K&R C...
A third way is to note that your problem is very specialized compared to
general serialization. You're not interested in arbitrary structures,
only simple PODs. Thus, if you could define some simple descriptor,
then perhaps that would be acceptable for client code. One example of a
descriptor sufficient for your needs would be a list of offsets for the
fields in the struct, with a final offset just past the final field. I
think this would be my method of choice: not especially type safe, but
solving the practical problem at hand (perhaps the Boost preprocessor
facilities could be of help in automating descriptor generation).
Hth.,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?