17 template <
class Object,
class MemberFn,
class ArgsTuple>
27 invoke(std::make_index_sequence<std::tuple_size_v<ArgsTuple>>());
30 template <std::size_t... I>
31 void invoke(std::index_sequence<I...>) {
40 template <
class ResultType,
class Object,
class MemberFn,
class ArgsTuple>
43 AskMessageImpl(std::promise<ResultType> promise_,
Object& object_, MemberFn memberFn_, ArgsTuple argsTuple_)
51 promise.set_value(
ask(std::make_index_sequence<std::tuple_size_v<ArgsTuple>>()));
54 template <std::size_t... I>
55 ResultType
ask(std::index_sequence<I...>) {
65 template <
class Object,
class MemberFn,
class ArgsTuple>
76 ask(std::make_index_sequence<std::tuple_size_v<ArgsTuple>>());
80 template <std::size_t... I>
81 void ask(std::index_sequence<I...>) {
93 template <
class Object,
class MemberFn,
class... Args>
95 auto tuple = std::make_tuple(std::forward<Args>(args)...);
96 return std::make_unique<
MessageImpl<
Object, MemberFn, decltype(tuple)>>(object, memberFn, std::move(tuple));
99 template <
class ResultType,
class Object,
class MemberFn,
class... Args>
100 std::unique_ptr<Message>
makeMessage(std::promise<ResultType>&& promise,
Object&
object, MemberFn memberFn, Args&&... args) {
101 auto tuple = std::make_tuple(std::forward<Args>(args)...);
102 return std::make_unique<
AskMessageImpl<ResultType,
Object, MemberFn, decltype(tuple)>>(std::move(promise), object, memberFn, std::move(tuple));
void operator()() override
std::promise< void > promise
void ask(std::index_sequence< I... >)
AskMessageImpl(std::promise< void > promise_, Object &object_, MemberFn memberFn_, ArgsTuple argsTuple_)
ResultType ask(std::index_sequence< I... >)
void operator()() override
std::promise< ResultType > promise
AskMessageImpl(std::promise< ResultType > promise_, Object &object_, MemberFn memberFn_, ArgsTuple argsTuple_)
MessageImpl(Object &object_, MemberFn memberFn_, ArgsTuple argsTuple_)
void operator()() override
void invoke(std::index_sequence< I... >)
virtual void operator()()=0
virtual ~Message()=default
std::unique_ptr< Message > makeMessage(Object &object, MemberFn memberFn, Args &&... args)
constexpr ObjectType Object