#include <stdio.h>
#include <type_traits>
void print()
{
printf("cheers from print !\n");
}
class A
{
public:
void print()
{
printf("cheers from A !");
}
};
template<typename Function>
typename std::enable_if< std::is_function<
typename std::remove_pointer<Function>::type >::value,
void >::type
run(Function f)
{
f();
}
template<typename T>
typename std::enable_if< !std::is_function<
typename std::remove_pointer<T>::type >::value,
void >::type
run(T& t)
{
t.print();
}
int main()
{
run(print);
A a;
run(a);
return 0;
}
Приведенный выше код компилируется и печатается, как и ожидалось:
ура от печати! ура от A!
, что я бы хотел express: «если шаблон является функцией, тогда примените эту функцию, иначе ...». Или в другой формулировке: наличие версии функции для шаблонов функций и версии по умолчанию для не функциональных шаблонов.
так что эта часть кажется несколько избыточной и может быть «заменена» условием «else» :
template<typename T>
typename std::enable_if< !std::is_function<
typename std::remove_pointer<T>::type >::value,
void >::type
run(T& t)
будет ли это существовать?