Iterating over non-incremental Enum

前端 未结 15 1829
长发绾君心
长发绾君心 2021-01-31 15:42

Before you ask, I\'ve looked and looked for this on SO, and cannot find a solid answer.

I need to be able to dynamically iterate over an enum that has non-incre

15条回答
  •  灰色年华
    2021-01-31 16:13

    Here's one more approach. One bonus is that your compiler may warn you if you omit an enum value in a switch:

    template
    void IMP_Apply(const int& pSubtype, T& pApply) {
        switch (pSubtype) {
            case CAPI_SUBTYPE_NULL :
            case CAPI_SUBTYPE_DIAG_DFD :
            case CAPI_SUBTYPE_DIAG_ERD :
            case CAPI_SUBTYPE_DIAG_STD :
            case CAPI_SUBTYPE_DIAG_STC :
            case CAPI_SUBTYPE_DIAG_DSD :
            case CAPI_SUBTYPE_SPEC_PROCESS :
            case CAPI_SUBTYPE_SPEC_MODULE :
            case CAPI_SUBTYPE_SPEC_TERMINATOR :
            case CAPI_SUBTYPE_DD_ALL :
            case CAPI_SUBTYPE_DD_COUPLE :
            case CAPI_SUBTYPE_DD_DATA_AREA :
            case CAPI_SUBTYPE_DD_DATA_OBJECT :
            case CAPI_SUBTYPE_DD_FLOW :
            case CAPI_SUBTYPE_DD_RELATIONSHIP :
            case CAPI_SUBTYPE_DD_STORE :
            case CAPI_SUBTYPE_DIAG_PAD :
            case CAPI_SUBTYPE_DIAG_BD :
            case CAPI_SUBTYPE_DIAG_UCD :
            case CAPI_SUBTYPE_DIAG_PD :
            case CAPI_SUBTYPE_DIAG_COD :
            case CAPI_SUBTYPE_DIAG_SQD :
            case CAPI_SUBTYPE_DIAG_CD :
            case CAPI_SUBTYPE_DIAG_SCD :
            case CAPI_SUBTYPE_DIAG_ACD :
            case CAPI_SUBTYPE_DIAG_CPD :
            case CAPI_SUBTYPE_DIAG_DPD :
            case CAPI_SUBTYPE_DIAG_PFD :
            case CAPI_SUBTYPE_DIAG_HIER :
            case CAPI_SUBTYPE_DIAG_IDEF0 :
            case CAPI_SUBTYPE_DIAG_AID :
            case CAPI_SUBTYPE_DIAG_SAD :
            case CAPI_SUBTYPE_DIAG_ASG :
                /* do something. just `applying`: */
                pApply(static_cast(pSubtype));
                return;
        }
    
        std::cout << "Skipped: " << pSubtype << '\n';
    }
    
    template
    void Apply(T& pApply) {
        const CAPI_SUBTYPE_E First(CAPI_SUBTYPE_NULL);
        const CAPI_SUBTYPE_E Last(CAPI_SUBTYPE_DIAG_ASG);
    
        for (int idx(static_cast(First)); idx <= static_cast(Last); ++idx) {
            IMP_Apply(idx, pApply);
        }
    }
    
    int main(int argc, const char* argv[]) {
        class t_apply {
        public:
            void operator()(const CAPI_SUBTYPE_E& pSubtype) const {
                std::cout << "Apply: " << static_cast(pSubtype) << '\n';
            }
        };
        t_apply apply;
        Apply(apply);
        return 0;
    }
    

提交回复
热议问题