Skip to content

Commit 2dcf90c

Browse files
committed
Isolate traits and fix unqualified invoke call
Fixes #10
1 parent a1978bb commit 2dcf90c

File tree

2 files changed

+20
-11
lines changed

2 files changed

+20
-11
lines changed

include/tl/function_ref.hpp

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@
6363

6464
namespace tl {
6565
namespace detail {
66-
#ifndef TL_TRAITS_MUTEX
67-
#define TL_TRAITS_MUTEX
66+
namespace fnref {
6867
// C++14-style aliases for brevity
6968
template <class T> using remove_const_t = typename std::remove_const<T>::type;
7069
template <class T>
@@ -99,17 +98,16 @@ template <class F, class, class... Us> struct invoke_result_impl;
9998

10099
template <class F, class... Us>
101100
struct invoke_result_impl<
102-
F, decltype(invoke(std::declval<F>(), std::declval<Us>()...), void()),
101+
F, decltype(tl::detail::fnref::invoke(std::declval<F>(), std::declval<Us>()...), void()),
103102
Us...> {
104-
using type = decltype(invoke(std::declval<F>(), std::declval<Us>()...));
103+
using type = decltype(tl::detail::fnref::invoke(std::declval<F>(), std::declval<Us>()...));
105104
};
106105

107106
template <class F, class... Us>
108107
using invoke_result = invoke_result_impl<F, void, Us...>;
109108

110109
template <class F, class... Us>
111110
using invoke_result_t = typename invoke_result<F, Us...>::type;
112-
#endif
113111

114112
template <class, class R, class F, class... Args>
115113
struct is_invocable_r_impl : std::false_type {};
@@ -123,6 +121,7 @@ template <class R, class F, class... Args>
123121
using is_invocable_r = is_invocable_r_impl<std::true_type, R, F, Args...>;
124122

125123
} // namespace detail
124+
} // namespace fnref
126125

127126
/// A lightweight non-owning reference to a callable.
128127
///
@@ -148,13 +147,13 @@ template <class R, class... Args> class function_ref<R(Args...)> {
148147
///
149148
/// \synopsis template <typename F> constexpr function_ref(F &&f) noexcept
150149
template <typename F,
151-
detail::enable_if_t<
152-
!std::is_same<detail::decay_t<F>, function_ref>::value &&
153-
detail::is_invocable_r<R, F &&, Args...>::value> * = nullptr>
150+
detail::fnref::enable_if_t<
151+
!std::is_same<detail::fnref::decay_t<F>, function_ref>::value &&
152+
detail::fnref::is_invocable_r<R, F &&, Args...>::value> * = nullptr>
154153
TL_FUNCTION_REF_11_CONSTEXPR function_ref(F &&f) noexcept
155154
: obj_(const_cast<void*>(reinterpret_cast<const void *>(std::addressof(f)))) {
156155
callback_ = [](void *obj, Args... args) -> R {
157-
return detail::invoke(
156+
return detail::fnref::invoke(
158157
*reinterpret_cast<typename std::add_pointer<F>::type>(obj),
159158
std::forward<Args>(args)...);
160159
};
@@ -172,12 +171,12 @@ template <class R, class... Args> class function_ref<R(Args...)> {
172171
///
173172
/// \synopsis template <typename F> constexpr function_ref &operator=(F &&f) noexcept;
174173
template <typename F,
175-
detail::enable_if_t<detail::is_invocable_r<R, F &&, Args...>::value>
174+
detail::fnref::enable_if_t<detail::fnref::is_invocable_r<R, F &&, Args...>::value>
176175
* = nullptr>
177176
TL_FUNCTION_REF_11_CONSTEXPR function_ref<R(Args...)> &operator=(F &&f) noexcept {
178177
obj_ = reinterpret_cast<void *>(std::addressof(f));
179178
callback_ = [](void *obj, Args... args) {
180-
return detail::invoke(
179+
return detail::fnref::invoke(
181180
*reinterpret_cast<typename std::add_pointer<F>::type>(obj),
182181
std::forward<Args>(args)...);
183182
};

tests/issues.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,14 @@ tl::function_ref<Fruit* ()> bar()
1919

2020
TEST_CASE("Issue #9") {
2121
REQUIRE(bar()() == nullptr);
22+
}
23+
24+
void foo(const tl::function_ref<int(const std::vector<int>)>& func) {
25+
REQUIRE(func({ 12 }) == 144);
26+
}
27+
28+
TEST_CASE("Issue #10") {
29+
int z = 12;
30+
auto f = [&](const std::vector<int> i) { return i[0] * z; };
31+
foo(f);
2232
}

0 commit comments

Comments
 (0)