Skip to content

Commit 949fe85

Browse files
committed
replace SFINAE trick with if constexpr
clang-tidy recomments replacing `enable_if` with C++20 `requires`. However, using `if constexpr` results in simpler code here.
1 parent 35944ff commit 949fe85

File tree

1 file changed

+46
-26
lines changed

1 file changed

+46
-26
lines changed

include/mp/proxy-types.h

Lines changed: 46 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,45 @@ struct StructField
3737
}
3838
Struct& m_struct;
3939

40-
// clang-format off
41-
template<typename A = Accessor> auto get() const -> decltype(A::get(this->m_struct)) { return A::get(this->m_struct); }
42-
template<typename A = Accessor> auto has() const -> std::enable_if_t<A::optional, bool> { return A::getHas(m_struct); }
43-
template<typename A = Accessor> auto has() const -> std::enable_if_t<!A::optional && A::boxed, bool> { return A::has(m_struct); }
44-
template<typename A = Accessor> auto has() const -> std::enable_if_t<!A::optional && !A::boxed, bool> { return true; }
45-
template<typename A = Accessor> auto want() const -> std::enable_if_t<A::requested, bool> { return A::getWant(m_struct); }
46-
template<typename A = Accessor> auto want() const -> std::enable_if_t<!A::requested, bool> { return true; }
47-
template<typename A = Accessor, typename... Args> decltype(auto) set(Args&&... args) const { return A::set(this->m_struct, std::forward<Args>(args)...); }
48-
template<typename A = Accessor, typename... Args> decltype(auto) init(Args&&... args) const { return A::init(this->m_struct, std::forward<Args>(args)...); }
49-
template<typename A = Accessor> auto setHas() const -> std::enable_if_t<A::optional> { return A::setHas(m_struct); }
50-
template<typename A = Accessor> auto setHas() const -> std::enable_if_t<!A::optional> { }
51-
template<typename A = Accessor> auto setWant() const -> std::enable_if_t<A::requested> { return A::setWant(m_struct); }
52-
template<typename A = Accessor> auto setWant() const -> std::enable_if_t<!A::requested> { }
53-
// clang-format on
40+
decltype(auto) get() const { return Accessor::get(this->m_struct); }
41+
42+
bool has() const {
43+
if constexpr (Accessor::optional) {
44+
return Accessor::getHas(m_struct);
45+
} else if constexpr (Accessor::boxed) {
46+
return Accessor::has(m_struct);
47+
} else {
48+
return true;
49+
}
50+
}
51+
52+
bool want() const {
53+
if constexpr (Accessor::requested) {
54+
return Accessor::getWant(m_struct);
55+
} else {
56+
return true;
57+
}
58+
}
59+
60+
template <typename... Args> decltype(auto) set(Args &&...args) const {
61+
return Accessor::set(this->m_struct, std::forward<Args>(args)...);
62+
}
63+
64+
template <typename... Args> decltype(auto) init(Args &&...args) const {
65+
return Accessor::init(this->m_struct, std::forward<Args>(args)...);
66+
}
67+
68+
void setHas() const {
69+
if constexpr (Accessor::optional) {
70+
Accessor::setHas(m_struct);
71+
}
72+
}
73+
74+
void setWant() const {
75+
if constexpr (Accessor::requested) {
76+
Accessor::setWant(m_struct);
77+
}
78+
}
5479
};
5580

5681

@@ -650,19 +675,14 @@ void clientInvoke(ProxyClient& proxy_client, const GetRequest& get_request, Fiel
650675
//! return value with value of `ret()`. This is useful for avoiding code
651676
//! duplication and branching in generic code that forwards calls to functions.
652677
template <typename Fn, typename Ret>
653-
auto ReplaceVoid(Fn&& fn, Ret&& ret) ->
654-
std::enable_if_t<std::is_same_v<void, decltype(fn())>, decltype(ret())>
678+
auto ReplaceVoid(Fn&& fn, Ret&& ret)
655679
{
656-
fn();
657-
return ret();
658-
}
659-
660-
//! Overload of above for non-void `fn()` case.
661-
template <typename Fn, typename Ret>
662-
auto ReplaceVoid(Fn&& fn, Ret&& ret) ->
663-
std::enable_if_t<!std::is_same_v<void, decltype(fn())>, decltype(fn())>
664-
{
665-
return fn();
680+
if constexpr (std::is_same_v<decltype(fn()), void>) {
681+
fn();
682+
return ret();
683+
} else {
684+
return fn();
685+
}
666686
}
667687

668688
extern std::atomic<int> server_reqs;

0 commit comments

Comments
 (0)