IsClass and IsNumber traits
parent
0500e52295
commit
0311af0ffe
|
@ -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 {};
|
||||
|
|
Loading…
Reference in New Issue