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_;
};