Listing 4: Defining the structure.
typedef enum { male, female } gender_t;
typedef enum { single, married } marital_status_t;
template<gender_t G,
marital_status_t M,
bool Parent,
typename Char=char>
struct personal_details
{
typedef Char char_type;
typedef
std::basic_string<char_type>
name_t;
typedef
std::vector<name_t>
names_t;
gender_t gender_;
names_t forenames_;
name_t surname_;
optional_storage<
name_t,
G == female && M == married>
maiden_name_;
optional_storage<
names_t,
Parent>
children_;
};