Используя первый подход, вы можете реализовать статическую диспетчеризацию без , используя if/else
или switch
.
template <typename T>
void Dispatch(T t)
{
//Call foo(T, true_type) or foo(T, false_type)
//depending upon the *type* of second parameter.
foo(t, typename is_integral<T>::type());
}
Используя второй подход, вы должны реализовать это, используя блок if/else
или switch
,
template <typename T>
void Dispatch(T t)
{
//Call foo(T, true_type) or foo(T, false_type)
//depending upon the *value* of value.
if(std::is_integral<T>::value)
foo(t, true_type());
else
foo(t, false_type());
}
Но если вы хотите реализовать свою функцию Dispatch()
безиспользуя if/else
, и в то же время вы хотите использовать std::is_integral<T>::value
, тогда вам придется переписать вашу foo()
функцию, например,
template <bool b>
void foo(T t)
{
std::cout << t << " is integral";
}
template <>
void foo<false>(T t)
{
std::cout << t << " is not integral";
}
И ваша Dispatch()
функция будетвыглядеть,
template <typename T>
void Dispatch(T t)
{
//using std::is_integral<T>::value!
const bool selector = (bool) std::is_integral<T>::value;
foo<selector>(t);
}