1 /*
2
3 Copyright Barrett Adair 2015-2017
4 Distributed under the Boost Software License, Version 1.0.
5 (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
6
7 */
8
9 #include <type_traits>
10 #include <cstdint>
11 #include <memory>
12 #include <boost/callable_traits.hpp>
13 #include "test.hpp"
14
15
16 struct foo1 {
barfoo117 int bar(char, float&, int = 0) { return{}; }
18 };
19
20 struct foo2 {
barfoo221 int bar(char, float&, int = 0, ...) { return{}; }
22 };
23
24 struct foo3 {
operator ()foo325 int operator()(char, float&, int = 0) { return{}; }
26 };
27
28 struct foo4 {
operator ()foo429 int operator()(char, float&, int = 0, ...) { return{}; }
30 };
31
foo5(char,float &,int=0)32 int foo5(char, float&, int = 0) { return{}; }
33
foo6(char,float &,int=0,...)34 int foo6(char, float&, int = 0, ...) { return{}; }
35
36 struct foo7 {
barfoo737 int bar() { return{}; }
38 };
39
40 using std::is_same;
41
main()42 int main() {
43
44 {
45 using pmf = decltype(&foo1::bar);
46 using args_t = TRAIT(args, pmf);
47 CT_ASSERT(is_same<args_t, std::tuple<foo1&, char, float&, int>>{});
48 } {
49 using pmf = decltype(&foo2::bar);
50 using args_t = TRAIT(args, pmf);
51 CT_ASSERT(is_same<args_t, std::tuple<foo2&, char, float&, int>>{});
52 } {
53 using args_t = TRAIT(args, foo3);
54 CT_ASSERT(is_same<args_t, std::tuple<char, float&, int>>{});
55 } {
56 using args_t = TRAIT(args, foo4);
57 CT_ASSERT(is_same<args_t, std::tuple<char, float&, int>>{});
58 } {
59 using args_t = TRAIT(args, decltype(foo5));
60 CT_ASSERT(is_same<args_t, std::tuple<char, float&, int>>{});
61 } {
62 using args_t = TRAIT(args, decltype(foo6));
63 CT_ASSERT(is_same<args_t, std::tuple<char, float&, int>>{});
64 }
65
66 return 0;
67 }
68