Skip to content

Commit 7d40a9a

Browse files
Specialized simply::fn<Affordance> to deduce T
1 parent f608159 commit 7d40a9a

3 files changed

Lines changed: 22 additions & 7 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ struct insertable : simply::member_affordance_base {
2424
template <typename Self>
2525
struct simply::iface<insertable, Self> {
2626
friend auto operator<<(std::ostream &out, const Self &self) -> std::ostream & {
27-
return simply::fn<insertable, Self>(self, out);
27+
return simply::fn<insertable>(self, out);
2828
}
2929
};
3030

include/simply/impl.hpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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>
1618
inline 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

2237
template <simply::member_affordance Affordance, typename T>
2338
struct affordance_traits<Affordance, T> {

tests/counters.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ struct labeled : simply::member_affordance_base {
4646
template <typename CountT, typename Self>
4747
struct simply::iface<copy_countable<CountT>, Self> {
4848
constexpr auto copy_count(this const Self &self) -> CountT {
49-
return simply::fn<copy_countable<CountT>, Self>(self);
49+
return simply::fn<copy_countable<CountT>>(self);
5050
}
5151
};
5252

5353
template <typename LabelT, typename Self>
5454
struct simply::iface<labeled<LabelT>, Self> {
5555
constexpr auto label(this const Self &self) -> LabelT {
56-
return simply::fn<labeled<LabelT>, Self>(self);
56+
return simply::fn<labeled<LabelT>>(self);
5757
}
5858
};
5959

0 commit comments

Comments
 (0)