+
+ virtual void execute(Loader &l, const ArgumentStore &as) const
+ {
+ (dynamic_cast<L &>(l).*func)(as.get<A0>(0), as.get<A1>(1), as.get<A2>(2), as.get<A3>(3), as.get<A4>(4));
+ }
+
+ virtual std::string get_signature() const
+ {
+ std::string result;
+ result += TypeInfo<A0>::signature;
+ result += TypeInfo<A1>::signature;
+ result += TypeInfo<A2>::signature;
+ result += TypeInfo<A3>::signature;
+ result += TypeInfo<A4>::signature;
+ return result;
+ }
+};
+
+
+#if __cplusplus>=201103L
+template<unsigned I, typename... Args>
+struct Apply;
+
+template<unsigned I>
+struct Apply<I>
+{
+ template<typename L, typename F, typename... Args>
+ static void apply(L &l, F func, const Statement &, Args... args)
+ {
+ (l.*func)(args...);
+ }
+
+ template<typename L, typename F, typename... Args>
+ static void apply(L &l, F func, const ArgumentStore &, Args... args)
+ {
+ (l.*func)(args...);
+ }
+};
+
+template<unsigned I, typename Head, typename... Tail>
+struct Apply<I, Head, Tail...>
+{
+ template<typename L, typename F, typename... Args>
+ static void apply(L &l, F func, const Statement &st, Args... args)
+ {
+ Apply<I+1, Tail...>::apply(l, func, st, args..., st.args[I].get<Head>());
+ }
+
+ template<typename L, typename F, typename... Args>
+ static void apply(L &l, F func, const ArgumentStore &as, Args... args)
+ {
+ Apply<I+1, Tail...>::apply(l, func, as, args..., as.get<Head>(I));
+ }
+};
+
+
+template<typename L, typename... Args>
+class LoaderFuncN: public LoaderAction
+{
+protected:
+ typedef void (L::*FuncType)(Args...);
+