]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
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 | ||
29 | int 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 |