When I first learned how to check a specific signature in a class, I was taught to use std::void_t
and write some code like this:
template<typename T, typename =void>
class HAS:public false_type{};
template<typename T>
class HAS<T,void_t<decltype(declval<T>().print())>>:public true_type{};
And this snippet of code will check if a class has the method named "print()
". It works well.
But when I tried to remove the std::void_t
, it still worked.
The code looks like this:
template<typename T, typename = void>
class HAS:public false_type{};
template<typename T>
class HAS<T,decltype(declval<T>().print())>:public true_type{};
So I am confused if "std::void_t
" is necessary to check if a class has a method with a specific signature? Or that's only a coincidence?