@@ -12,12 +12,27 @@ struct impl {
1212 static constexpr auto fn = Affordance::template fn<T>;
1313};
1414
15- template <typename Affordance, typename T>
15+ struct _deduce_tag_t {};
16+
17+ template <typename Affordance, typename T = simply::_deduce_tag_t >
1618inline constexpr const auto &fn = simply::impl<Affordance, T>::fn;
1719
18- // TODO consider `bind<Affordance>(self)(rest...)` as an alternative to
19- // `fn<Affordance, remove_cvref_t<decltype(self)>>(self, rest...)` that exposes
20- // operator() as an overload set with non-deduced parameter types
20+ template <typename Affordance>
21+ struct _deduce_t {
22+ template <typename T, typename ... Args>
23+ static constexpr auto operator ()(T &&self, Args &&...args) noexcept (
24+ noexcept (simply::fn<Affordance, std::remove_cvref_t <T>>(
25+ std::forward<T>(self), std::forward<Args>(args)...)))
26+ -> decltype(simply::fn<Affordance, std::remove_cvref_t <T>>(
27+ std::forward<T>(self), std::forward<Args>(args)...)) {
28+ return simply::fn<Affordance, std::remove_cvref_t <T>>(
29+ std::forward<T>(self), std::forward<Args>(args)...);
30+ }
31+ };
32+
33+ template <typename Affordance>
34+ inline constexpr simply::_deduce_t <Affordance>
35+ fn<Affordance, simply::_deduce_tag_t >{};
2136
2237template <simply::member_affordance Affordance, typename T>
2338struct affordance_traits <Affordance, T> {
0 commit comments