IsClass and IsNumber traits

master
Daniel Kolesa 2015-04-13 23:19:52 +01:00
parent 0500e52295
commit 0311af0ffe
1 changed files with 21 additions and 3 deletions

View File

@ -47,7 +47,7 @@ namespace octa {
static const T value = val;
typedef T value_type;
typedef IntegralConstant<T, v> type;
typedef IntegralConstant<T, val> type;
};
typedef IntegralConstant<bool, true> true_t;
@ -79,13 +79,19 @@ namespace octa {
template<typename T> struct IsFloatBase : false_t {};
template<> struct IsFloatBase<float>: true_t {};
template<> struct IsFloatBase<double>: true_t {};
template<> struct IsFloatBase<float >: true_t {};
template<> struct IsFloatBase<double >: true_t {};
template<> struct IsFloatBase<ldouble>: true_t {};
template<typename T>
struct IsFloat: IsFloatBase<typename RemoveConstVolatile<T>::type> {};
/* is number */
template<typename T> struct IsNumber: IntegralConstant<bool,
(IsInteger<T>::value || IsFloat<T>::value)
> {};
/* is pointer */
template<typename > struct IsPointerBase : false_t {};
@ -100,6 +106,18 @@ namespace octa {
(IsInteger<T>::value || IsFloat<T>::value || IsPointer<T>::value)
> {};
/* is class */
struct IsClassBase {
template<typename T> static char test(void (T::*)(void));
template<typename > static int test(...);
};
template<typename T>
struct IsClass: IntegralConstant<bool,
sizeof(IsClassBase::test<T>(0)) == 1
> {};
/* type equality */
template<typename, typename> struct IsEqual : false_t {};