
On 02/21/13 12:53, Chris Stankevitz wrote:
On Thu, Feb 21, 2013 at 9:04 AM, Larry Evans <cppljevans@suddenlink.net> wrote:
How do you decide whether the Stream argument to Decode contains a String or a Double? Is that already known? IOW, if you open the istream, do you *know* what types it contains already and only need to fill in the values?
Thank you all for your interest and help. I LOVE boost and have been using it for almost a year now. I cannot live without signals2, thread, and shared_ptr. They have changed the way I. I am eager to learn about the other components.
I created a simple program that basically does what I want to do. Of course in my real application the objects are more complicated and this is just one small piece of everything I need to do.
What I hope to highlight with this sample cpp is:
1. I am decoding data. The format is about as simple and "fixed" as you can imagine.
2. The data is not "POD-encoded" values. Sometimes I have to perform conversions on the values. For example "temperature" in the example.
3. I would like to keep track of some static known-at-compile-time meta-data for each of the values such as the units they are in. This I use for display purposes.
4. Some values have meta data that other values do not, such as floating point values which have a "number of significant digits after the decimal point" which I illustrate with the "temperature" example.
5. I will have many values. ~60. In my example I attempt to highlight what a mess the class will turn into if I make no attempt to use boost::variant, boost::any, polymorphism, etc.
6. An external class "TCTimer" in my example will want access to Get/Set values in the class.
7. I appear to be confusing/merging several concepts: 1) decoding 2) tracking meta data for members 3) replace-lots-of-members-and-with-a-vector-of-something-like-boost::variant
This 7th feature is not represented by your example code. The example code suggests the type being read is already known. OTOH, your previous example code had a vector of pointers to an abstract class: class EmployeePacket { std::vector<Item*> Items; suggesting that *maybe* the concrete classes are only known at runtime. OTOH, that same code had a CTOR: EmployeePacket() { Items.push_back(new String("name", "John Doe")); Items.push_back(new Double("salary", "USD", 1, 1)); } suggesting the actual values were really known and there was really no need for the abstract Item class or, AFAICT, any need for something like boost::variant. Could you please clarify? Also, the code: std::istringstream Stream(Bytes.substr(0, ByteCount)); unsigned short Temperature; Stream.read(reinterpret_cast<char*>(&Temperature), 2); Stream.read(reinterpret_cast<char*>(&mAge), 4); worries me because it assumes 2 bytes are used to store a short and 4 bytes are used to store an int. I'm not sure how portable this is. In addition, the comments: // First two bytes are a temperature encoded as an uint16. // 0=>25 DegF // 2^16=>125 DegF // // Next four bytes Age is encoded as an int32 // // Byte Value // 0 Temperature LSB // 1 Temperature MSB // 2 Age LSB // 3 Age ... // 4 Age ... // 5 Age MSB // // Total bytes: 6 suggest that there's a specific encoding of the values which implies that there needs to be a specific decoding of the bit's in the bytes in the Byte argument. IOW, I don't think the reinterpret_cast and using of istream.read will give you what you want according to the comments. HTH. -regards, Larry
Again, thank you,
Chris
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users