// tmp_policy // Created by lucas on 22-7-26. // Re-implementation of a typical policy architecture in C++ Template Meta-Programming. #ifndef TMP_POLICY_ACCPOLICY_H #define TMP_POLICY_ACCPOLICY_H // Policy Major Class definition. struct AccPolicy { using MajorClass = AccPolicy; struct AccuTypeCate { struct Add; struct Mul; }; using AccuType = AccuTypeCate::Add; struct IsAveValueCate; static constexpr bool IsAveValue = false; struct ResultTypeCate; using ResultType = int; }; // Auxiliary Macros Definition. #define TypePolicyObj(TName, TMajor, TMinor, TType) \ struct TName: virtual public TMajor { \ using MinorClass = TMinor##TypeCate; \ using TMinor##Type = TMinor##TypeCate::TType; \ } #define ValuePolicyObj(TName, TMajor, TMinor, TValueType, TValue) \ struct TName: virtual public TMajor { \ using MinorClass = TMinor##ValueCate; \ static constexpr TValueType TMinor##Value = TValue; \ } #define TypePolicyTemplate(TName, TMajor, TMinor) \ template \ struct TName: virtual public TMajor{ \ using MinorClass = TMinor##TypeCate; \ using TMinor##Type = T; \ } // Policy objects defined with auxiliary macros. TypePolicyObj(PAdd, AccPolicy, Accu, Add); TypePolicyObj(PMul, AccPolicy, Accu, Mul); ValuePolicyObj(PAve, AccPolicy, IsAve, bool, true); ValuePolicyObj(PNoAve, AccPolicy, IsAve, bool, false); TypePolicyTemplate(PResultTypeIs, AccPolicy, Result); #endif //TMP_POLICY_ACCPOLICY_H