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