Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to encapsulate "optional" fields within a struct generically in C++?

I have many concrete-structs and I want to designate fields as optional (present or not-present). Just wondering what ideas people have for achieving this. Here is an example struct (fields can be other structs as well, even vectors of structs):

 struct LogonMessage_t
       {
          Header_t header; // this points to another struct containing all primitives
          std::string username;
          std::string password;
          std::vector<LogonOption_t> LogonOptions;
          int subaccountid;
          std::string Text;
       }

I'd like to default all fields to not-present and enable them one by one, perhaps in their setters. Since these structs are generated, a generic method would be preferable.

My ideas so far are:

  1. Bitmap of fields indicating if a field is set or not
  2. Use sentinel values ("\0" for std::string, -1 for int, -1.0f for float
  3. Some kind of template container/proxy encapsulating each field to indicate if it's set or not, any ideas? I think this might be the best approach.

Btw, using maps or other STL containers to encapsulate the fields won't work here, they need to be concrete structs.

like image 258
chriskirk Avatar asked Mar 21 '11 14:03

chriskirk


2 Answers

Sounds like you want boost.optional.

like image 116
ildjarn Avatar answered Oct 20 '22 12:10

ildjarn


Keep it simple. Use a flag member variable that you can set by or-ing constants together and inspect by and-ing them.

Problem with sentinel values is choosing ones that are not also legal field values (now and in the future).

like image 26
Andy Johnson Avatar answered Oct 20 '22 10:10

Andy Johnson