Unable to compile SFINAE in Visual Studio 10

#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.

+4
source share
1 answer

This compiles and works correctly in VS2010. Modified using David's suggestion.

 #include <iostream> #include <vector> #include <algorithm> #include <utility> #include <functional> #include <type_traits> struct X { typedef X is_x; }; struct Y {}; __int8 f(X x) { return 0; } __int16 f(...) { return 0; } template < class T > struct test { enum { result = sizeof(f(T())) }; }; template <typename T> typename std::enable_if< test<T>::result == sizeof(__int8), int>::type call(T const& t) { std::cout << "In call with f available" << std::endl; f(t); return 0; } template < typename T > typename std::enable_if< test<T>::result == sizeof(__int16), int>::type call(T const& t) { std::cout << "In call without f available" << std::endl; return 0; } int main() { Y y; X x; call(y); call(x); } 
+2
source

Source: https://habr.com/ru/post/1337155/


All Articles