Skip to content
This repository was archived by the owner on Jan 29, 2026. It is now read-only.

Commit c224dee

Browse files
authored
Implement PRO_DEF_FREE_AS_MEM_DISPATCH (#189)
1 parent d742a33 commit c224dee

2 files changed

Lines changed: 25 additions & 0 deletions

File tree

proxy.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1582,6 +1582,21 @@ struct conversion_dispatch {
15821582
#define PRO_DEF_FREE_DISPATCH(__NAME, ...) \
15831583
___PRO_EXPAND_MACRO(___PRO_DEF_FREE_DISPATCH, __NAME, __VA_ARGS__)
15841584

1585+
#define ___PRO_DEF_FREE_AS_MEM_DISPATCH_IMPL(__NAME, __FUNC, __FNAME) \
1586+
struct __NAME { \
1587+
template <class __T, class... __Args> \
1588+
decltype(auto) operator()(__T&& __self, __Args&&... __args) \
1589+
___PRO_DIRECT_FUNC_IMPL(__FUNC(::std::forward<__T>(__self), \
1590+
::std::forward<__Args>(__args)...)) \
1591+
___PRO_DEF_MEM_ACCESSOR_TEMPLATE(___PRO_DEF_MEM_ACCESSOR, __FNAME) \
1592+
}
1593+
#define ___PRO_DEF_FREE_AS_MEM_DISPATCH_2(__NAME, __FUNC) \
1594+
___PRO_DEF_FREE_AS_MEM_DISPATCH_IMPL(__NAME, __FUNC, __FUNC)
1595+
#define ___PRO_DEF_FREE_AS_MEM_DISPATCH_3(__NAME, __FUNC, __FNAME) \
1596+
___PRO_DEF_FREE_AS_MEM_DISPATCH_IMPL(__NAME, __FUNC, __FNAME)
1597+
#define PRO_DEF_FREE_AS_MEM_DISPATCH(__NAME, ...) \
1598+
___PRO_EXPAND_MACRO(___PRO_DEF_FREE_AS_MEM_DISPATCH, __NAME, __VA_ARGS__)
1599+
15851600
#define PRO_DEF_WEAK_DISPATCH(__NAME, __D, __FUNC) \
15861601
struct __NAME : __D { \
15871602
using __D::operator(); \

tests/proxy_dispatch_tests.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ struct PtrToMemTester {
3232
private:
3333
int value_;
3434
};
35+
36+
PRO_DEF_FREE_AS_MEM_DISPATCH(FreeMemToString, std::to_string, ToString);
37+
3538
} // namespace
3639

3740
TEST(ProxyDispatchTests, TestOpPlus) {
@@ -613,3 +616,10 @@ TEST(ProxyDispatchTests, TestImplciitConversion) {
613616
int converted = *p;
614617
ASSERT_EQ(converted, 12);
615618
}
619+
620+
TEST(ProxyDispatchTests, TestFreeAsMemDispatch) {
621+
struct TestFacade : pro::facade_builder::add_convention<FreeMemToString, std::string() const>::build {};
622+
int v = 123;
623+
pro::proxy<TestFacade> p = &v;
624+
ASSERT_EQ(p->ToString(), "123");
625+
}

0 commit comments

Comments
 (0)