@@ -7,43 +7,79 @@ export namespace CppUtils::Type
77 template<class T>
88 struct CallableTrait;
99
10- template<class Functor>
11- requires requires { &Functor::operator(); }
12- struct CallableTrait<Functor>: CallableTrait<decltype(&Functor::operator())>
13- {};
14-
1510 template<class Return, class... Args>
16- struct CallableTrait<Return(Args...)>
11+ struct SignatureTrait
1712 {
1813 using ReturnType = Return;
1914 using ArgumentsTypes = std::tuple<Args...>;
2015 };
2116
17+ template<class Return, class... Args>
18+ struct CallableTrait<Return(Args...)>: SignatureTrait<Return, Args...>
19+ {};
20+
21+ template<class Return, class... Args>
22+ struct CallableTrait<Return(Args...) noexcept>: SignatureTrait<Return, Args...>
23+ {};
24+
2225 template<class Return, class... Args>
2326 struct CallableTrait<Return (*)(Args...)>: CallableTrait<Return(Args...)>
2427 {};
2528
29+ template<class Return, class... Args>
30+ struct CallableTrait<Return (*)(Args...) noexcept>: CallableTrait<Return(Args...) noexcept>
31+ {};
32+
2633 template<class Object, class Return, class... Args>
2734 struct CallableTrait<Return (Object::*)(Args...)>: CallableTrait<Return(Args...)>
2835 {};
2936
37+ template<class Object, class Return, class... Args>
38+ struct CallableTrait<Return (Object::*)(Args...) const>: CallableTrait<Return(Args...)>
39+ {};
40+
3041 template<class Object, class Return, class... Args>
3142 struct CallableTrait<Return (Object::*)(Args...) &>: CallableTrait<Return(Args...)>
3243 {};
3344
45+ template<class Object, class Return, class... Args>
46+ struct CallableTrait<Return (Object::*)(Args...) const&>: CallableTrait<Return(Args...)>
47+ {};
48+
3449 template<class Object, class Return, class... Args>
3550 struct CallableTrait<Return (Object::*)(Args...) &&>: CallableTrait<Return(Args...)>
3651 {};
3752
3853 template<class Object, class Return, class... Args>
39- struct CallableTrait<Return (Object::*)(Args...) const>: CallableTrait<Return(Args...)>
54+ struct CallableTrait<Return (Object::*)(Args...) const&& >: CallableTrait<Return(Args...)>
4055 {};
4156
4257 template<class Object, class Return, class... Args>
43- struct CallableTrait<Return (Object::*)(Args...) const& >: CallableTrait<Return(Args...)>
58+ struct CallableTrait<Return (Object::*)(Args...) noexcept >: CallableTrait<Return(Args...) noexcept >
4459 {};
4560
4661 template<class Object, class Return, class... Args>
47- struct CallableTrait<Return (Object::*)(Args...) const&&>: CallableTrait<Return(Args...)>
62+ struct CallableTrait<Return (Object::*)(Args...) const noexcept>: CallableTrait<Return(Args...) noexcept>
63+ {};
64+
65+ template<class Object, class Return, class... Args>
66+ struct CallableTrait<Return (Object::*)(Args...) & noexcept>: CallableTrait<Return(Args...) noexcept>
67+ {};
68+
69+ template<class Object, class Return, class... Args>
70+ struct CallableTrait<Return (Object::*)(Args...) const & noexcept>: CallableTrait<Return(Args...) noexcept>
71+ {};
72+
73+ template<class Object, class Return, class... Args>
74+ struct CallableTrait<Return (Object::*)(Args...) && noexcept>: CallableTrait<Return(Args...) noexcept>
75+ {};
76+
77+ template<class Object, class Return, class... Args>
78+ struct CallableTrait<Return (Object::*)(Args...) const && noexcept>: CallableTrait<Return(Args...) noexcept>
79+ {};
80+
81+ template<class Functor>
82+ requires requires { &Functor::operator(); }
83+ struct CallableTrait<Functor>: CallableTrait<decltype(&Functor::operator())>
4884 {};
4985}
0 commit comments