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/args.hpp> 11 #include "test.hpp" 12 13 struct foo; 14 15 template<typename T> 16 struct is_substitution_failure_args { 17 18 template<typename> 19 static auto test(...) -> std::true_type; 20 21 template<typename U, 22 TRAIT(boost::callable_traits::args, U, std::tuple)* = nullptr> 23 static auto test(int) -> std::false_type; 24 25 static constexpr bool value = decltype(test<T>(0))::value; 26 }; 27 main()28int main() { 29 30 CT_ASSERT(is_substitution_failure_args<int>::value); 31 CT_ASSERT(is_substitution_failure_args<int &>::value); 32 CT_ASSERT(is_substitution_failure_args<int (** const &)()>::value); 33 CT_ASSERT(is_substitution_failure_args<int (foo::** &)()>::value); 34 CT_ASSERT(is_substitution_failure_args<int (foo::** const)()>::value); 35 CT_ASSERT(is_substitution_failure_args<int (foo::** const &)()>::value); 36 CT_ASSERT(is_substitution_failure_args<int (foo::** volatile)()>::value); 37 CT_ASSERT(!is_substitution_failure_args<int (* const &)()>::value); 38 CT_ASSERT(!is_substitution_failure_args<int (foo::* &)()>::value); 39 CT_ASSERT(!is_substitution_failure_args<int (foo::* const)()>::value); 40 CT_ASSERT(!is_substitution_failure_args<int (foo::* const &)()>::value); 41 CT_ASSERT(!is_substitution_failure_args<int (foo::* volatile)()>::value); 42 auto lambda = [](){}; 43 CT_ASSERT(!is_substitution_failure_args<decltype(lambda)&>::value); 44 CT_ASSERT(is_substitution_failure_args<void>::value); 45 } 46 47