1 2 /* 3 Copyright Barrett Adair 2016-2017 4 5 Distributed under the Boost Software License, Version 1.0. 6 (See accompanying file LICENSE.md or copy at http ://boost.org/LICENSE_1_0.txt) 7 8 */ 9 10 #include <boost/callable_traits/qualified_class_of.hpp> 11 #include "test.hpp" 12 13 template<typename T> 14 struct is_substitution_failure_qualified_class_of { 15 16 template<typename> 17 static auto test(...) -> std::true_type; 18 19 template<typename A, 20 typename std::remove_reference< 21 TRAIT(qualified_class_of, A)>::type* = nullptr> 22 static auto test(int) -> std::false_type; 23 24 static constexpr bool value = decltype(test<T>(0))::value; 25 }; 26 27 struct foo; 28 main()29int main() { 30 31 auto lambda = [](){}; 32 33 CT_ASSERT(is_substitution_failure_qualified_class_of<decltype(lambda)>::value); 34 CT_ASSERT(is_substitution_failure_qualified_class_of<decltype(lambda)&>::value); 35 CT_ASSERT(is_substitution_failure_qualified_class_of<void>::value); 36 CT_ASSERT(is_substitution_failure_qualified_class_of<void*>::value); 37 CT_ASSERT(is_substitution_failure_qualified_class_of<int>::value); 38 CT_ASSERT(is_substitution_failure_qualified_class_of<int &>::value); 39 CT_ASSERT(is_substitution_failure_qualified_class_of<int()>::value); 40 CT_ASSERT(is_substitution_failure_qualified_class_of<int(*)()>::value); 41 CT_ASSERT(is_substitution_failure_qualified_class_of<int(**)()>::value); 42 CT_ASSERT(is_substitution_failure_qualified_class_of<int(&)()>::value); 43 CT_ASSERT(is_substitution_failure_qualified_class_of<int (* const &)()>::value); 44 CT_ASSERT(!is_substitution_failure_qualified_class_of<int (foo::* &)()>::value); 45 CT_ASSERT(!is_substitution_failure_qualified_class_of<int (foo::* const)()>::value); 46 CT_ASSERT(!is_substitution_failure_qualified_class_of<int (foo::* const &)()>::value); 47 CT_ASSERT(!is_substitution_failure_qualified_class_of<int (foo::* volatile)()>::value); 48 CT_ASSERT(is_substitution_failure_qualified_class_of<int (foo::**)()>::value); 49 CT_ASSERT(is_substitution_failure_qualified_class_of<int (foo::* const *)()>::value); 50 CT_ASSERT(is_substitution_failure_qualified_class_of<int (foo::* volatile *)()>::value); 51 } 52 53