| // (C) Copyright Mathias Gaunard 2009. |
| // Use, modification and distribution are subject to the |
| // Boost Software License, Version 1.0. (See accompanying file |
| // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| |
| // See http://www.boost.org/libs/config for the most recent version. |
| |
| // MACRO: BOOST_NO_SFINAE_EXPR |
| // TITLE: SFINAE for expressions |
| // DESCRIPTION: SFINAE for expressions not supported. |
| |
| namespace boost_no_sfinae_expr |
| { |
| |
| template<typename T> |
| struct has_foo |
| { |
| typedef char NotFound; |
| struct Found { char x[2]; }; |
| |
| template<int> struct dummy {}; |
| |
| template<class X> static Found test(dummy< sizeof((*(X*)0).foo(), 0) >*); |
| template<class X> static NotFound test( ... ); |
| |
| static const bool value = (sizeof(Found) == sizeof(test<T>(0))); |
| }; |
| |
| struct test1 {}; |
| struct test2 { void foo(); }; |
| |
| int test() |
| { |
| return has_foo<test1>::value || !has_foo<test2>::value; |
| } |
| |
| } // namespace boost_no_sfinae_expr |