12template <
typename Function>
21template <
typename Result,
typename Class,
typename... Args>
24 using type = boost::mp11::mp_list<Args...>;
28template <
typename Result,
typename Class,
typename... Args>
31 using type = boost::mp11::mp_list<Args...>;
35template <
typename Result,
typename... Args>
38 using type = boost::mp11::mp_list<Args...>;
42template <
typename Function>
44 std::type_identity<boost::mp11::mp_transform<
48template <
typename Function>
57template <
typename Result,
typename Class,
typename... Args>
64template <
typename Result,
typename Class,
typename... Args>
71template <
typename Result,
typename... Args>
82template <
typename Object,
84 typename... MemberFunctionArgumentTypesPlain>
90 decltype(&std::decay_t<Object>::operator())>::type
97template <
typename Result,
101 typename... MemberFunctionArgumentTypesPlain>
103 boost::mp11::mp_list<MemberFunctionArgumentTypesPlain...>,
104 Result (Object::*m)(Args...),
113template <
typename Result,
117 typename... MemberFunctionArgumentTypesPlain>
119 boost::mp11::mp_list<MemberFunctionArgumentTypesPlain...>,
120 Result (Object::*m)(Args...),
129template <
typename Result,
133 typename... MemberFunctionArgumentTypesPlain>
135 boost::mp11::mp_list<MemberFunctionArgumentTypesPlain...>,
136 Result (Object::*m)(Args...)
const,
145template <
typename Result,
148 typename... FunctionArgumentTypesPlain>
150 Result (*fct)(Args...),
156template <
typename Function,
typename... PassedArgsTuples>
167template <
typename Result,
169 typename... DeclaredArgs,
171 typename... PassedArgsTuples>
179 std::remove_cvref_t<PassedArgsTuples>...>
::type;
183template <
typename Result,
185 typename... DeclaredArgs,
186 typename... ClassAndPassedArgsTuples>
188 ClassAndPassedArgsTuples...>
191 ClassAndPassedArgsTuples...>
196template <
typename Result,
typename... DeclaredArgs,
typename... Tuples>
200 std::remove_cvref_t<Tuples>...>
::type;
213template <
typename Function,
typename... Args>
219 using FunctionPlain = std::decay_t<Function>;
220 using FlattenedTuple =
222 using FlattenedTupleOfPlainTypes =
223 mp_transform<std::remove_cvref_t, FlattenedTuple>;
227 "The types of all elements of all passed tuples must be unique.");
229 using FunctionArgumentTypesPlain =
234 "The argument types of the function to be called must be unique.");
237 std::forward<Function>(f),
238 std::forward<Args>(args)...);
250template <
typename Function,
typename... Tuples>
251auto apply(Function& f, Tuples&... ts) ->
254 static_assert(boost::mp11::mp_similar<std::tuple<>,
255 std::remove_cv_t<Tuples>...>::value,
256 "In the argument ts... there must be only std::tuple's.");
267template <
typename Function,
typename... Tuples>
268auto eval(Function& f, Tuples&... ts) ->
271 static_assert(boost::mp11::mp_similar<std::tuple<>,
272 std::remove_cv_t<Tuples>...>::value,
273 "In the argument ts... there must be only std::tuple's.");
287template <
typename Functions,
typename... Tuples>
290 boost::mp11::tuple_for_each(fs, [&ts...](
auto& f) { eval(f, ts...); });
auto unpackAndInvoke(boost::mp11::mp_list< MemberFunctionArgumentTypesPlain... >, Object &&o, Tuples &... ts) -> typename GetFunctionReturnType< decltype(&std::decay_t< Object >::operator())>::type
auto applyImpl(Function &&f, Args &&... args) -> typename detail::GetFunctionReturnType< std::decay_t< Function > >::type
std::type_identity< boost::mp11::mp_transform< std::remove_cvref_t, typename GetFunctionArgumentTypes< Function >::type > > GetFunctionArgumentTypesPlain
auto apply(Function &f, Tuples &... ts) -> typename detail::GetFunctionReturnType< std::decay_t< Function > >::type
auto & get(Tuples &... ts)
void evalAllInOrder(Functions &fs, Tuples &... ts)
auto eval(Function &f, Tuples &... ts) -> typename detail::GetFunctionReturnType< decltype(&Function::eval)>::type
constexpr bool mp_is_set_v
typename detail::GetFlattenedTupleTypes< std::remove_cvref_t< PassedArgsTuples >... >::type type
typename detail::GetFlattenedTupleTypes< std::remove_cvref_t< Tuples >... >::type type
boost::mp11::mp_list< Args... > type
boost::mp11::mp_list< Args... > type
boost::mp11::mp_list< Args... > type