#include <iostream> #include <vector> #include <algorithm> #include <utility> #include <functional> #include <type_traits> struct X {}; struct Y {}; __int8 f(X x) { return 0; } __int16 f(...) { return 0; } template <typename T> typename std::enable_if<sizeof(f(T())) == sizeof(__int8), int>::type call(T const& t) { std::cout << "In call with f available"; f(t); return 0; } template <typename T> typename std::enable_if<sizeof(f(T())) == sizeof(__int16), int>::type call(T const& t) { std::cout << "In call without f available"; return 0; } int main() { Y y; X x; call(y); call(x); }
It seems that using SFINAE is rather simple, but the compiler throws an error, which means that it cannot create an instance of enable_if<false, int>::type . Any suggestions? Apparently, this code compiles very well on GCC (did not ask which version).
Edit: this code compiles fine
#include <iostream> #include <vector> #include <algorithm> #include <utility> #include <functional> #include <type_traits> struct X {}; struct Y {}; __int8 f(X x) { return 0; } __int16 f(...) { return 0; } template<typename T> struct call_helper { static const int size = sizeof(f(T())); }; template <typename T> typename std::enable_if<call_helper<T>::size == sizeof(__int8), int>::type call(T const& t) { std::cout << "In call with f available"; f(t); return 0; } template <typename T> typename std::enable_if<call_helper<T>::size == sizeof(__int16), int>::type call(T const& t) { std::cout << "In call without f available"; return 0; } int main() { Y y; X x; call(y); call(x); }
Therefore, I am happy to record this album before being bugarooney.
Puppy source share