Если вы хотите ограничить вашу функцию getRatio
() только для int, long, double and float
, то вы также можете использовать эту функцию. Он выдаст «значимую» ошибку компиляции, если вы вызовете ее, скажем, с аргументом типа char
. Ошибка компиляции: this_type_is_not_allowed_in_getRatio .
//yourheader.h
template<typename T>
inline T getRatio(T numer, T denom)
{
typedef typelist<int, typelist<long, typelist<double, float>>> allowedtypes;
compile_time_checker<contains<allowedtypes, T>::result> this_type_is_not_allowed_in_getRatio;
return (numer/denom);
}
Использует этот заголовок:
//metafunctions.h
template<typename H, typename T>
struct typelist
{
typedef H Head;
typedef T Tail;
};
template<typename T, typename Tail>
struct contains
{
static const bool result = false;
};
template<typename Head, typename Tail, typename T>
struct contains<typelist<Head, Tail>, T>
{
static const bool result = false || contains<Tail, T>::result;
};
template<typename T, typename Tail>
struct contains<typelist<T, Tail>, T>
{
static const bool result = true || contains<Tail, T>::result;
};
template<bool b> struct compile_time_checker;
template<> struct compile_time_checker<true> {};
Надеюсь, это поможет вам. Теперь вы можете написать весь свой код в одной функции!