guanaqo main
Utilities for scientific software
Loading...
Searching...
No Matches
required-method.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file
4/// @ingroup type_erasure
5/// Macros to populate type-erased vtables from member functions in @ref guanaqo::TypeErased
6
8#include <functional> // std::invoke
9
10/// @ingroup type_erasure
11#define GUANAQO_TE_REQUIRED_METHOD(vtable, type, member) \
12 do { \
13 static_assert( \
14 requires { &type::member; }, \
15 "Missing required method '" #type "::" #member "'"); \
16 (vtable).member = \
17 ::guanaqo::type_erased_wrapped<type, &type::member>(); \
18 } while (0)
19/// @ingroup type_erasure
20#define GUANAQO_TE_OPTIONAL_METHOD(vtable, type, member, instance) \
21 do { \
22 if constexpr (requires { &type::member; }) { \
23 using vtable_t = ::std::remove_cvref_t<decltype(vtable)>; \
24 auto assign_vtable = [&] { \
25 (vtable).member = \
26 ::guanaqo::type_erased_wrapped<type, &type::member, \
27 const vtable_t &>(); \
28 }; \
29 if constexpr (requires { &type::provides_##member; }) { \
30 if (::std::invoke(&type::provides_##member, instance)) \
31 assign_vtable(); \
32 } else { \
33 assign_vtable(); \
34 } \
35 } \
36 } while (0)
Flexible type erasure utilities.