tmp-policy/accpolicy.h

54 lines
1.6 KiB
C
Raw Normal View History

2022-08-04 13:44:15 +08:00
// 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 <typename T> \
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