#ifndef INCLUDED_BASICTRAITS_H_ #define INCLUDED_BASICTRAITS_H_ template class BasicTraits { //BASIC template struct Basic { using Type = T; enum { isPointer = false, isConst = false, isRef = false, isRRef = false }; }; //= template struct Basic { using Type = T; enum { isPointer = true, isConst = true, isRef = false, isRRef = false }; }; //POINTER template struct Basic { using Type = T; enum { isPointer = true, isConst = false, isRef = false, isRRef = false }; }; //= //CONST template struct Basic { using Type = T; enum { isPointer = true, isConst = true, isRef = false, isRRef = false }; }; //= template struct Basic { using Type = T; enum { isPointer = false, isConst = false, isRef = true, isRRef = false }; }; template struct Basic { using Type = T; enum { isPointer = false, isConst = true, isRef = true, isRRef = false }; }; template struct Basic { using Type = T; enum { isPointer = false, isConst = false, isRef = false, isRRef = true }; }; template struct Basic { using Type = T; enum { isPointer = false, isConst = true, isRef = false, isRRef = true }; }; public: BasicTraits(BasicTraits const &other) = delete; using ValueType = typename Basic::Type; using PtrType = ValueType *; using RefType = ValueType &; using RvalueRefType = ValueType &&; enum { isPointerType = Basic::isPointer, isReferenceType = Basic::isRef, isRvalueReferenceType = Basic::isRRef, isConst = Basic::isConst, isPlainType = not (isPointerType or isReferenceType or isRvalueReferenceType or isConst) }; }; #endif