- simcall->call = call;
- memset(&simcall->result, 0, sizeof(simcall->result));
- marshal(simcall->args[0], std::forward<A>(a));
- marshal(simcall->args[1], std::forward<B>(b));
- marshal(simcall->args[2], std::forward<C>(c));
- marshal(simcall->args[3], std::forward<D>(d));
- marshal(simcall->args[4], std::forward<E>(e));
- marshal(simcall->args[5], std::forward<F>(f));
- marshal(simcall->args[6], std::forward<G>(g));
- marshal(simcall->args[7], std::forward<H>(h));
-}
-
-template<class A, class B, class C,
- class D, class E, class F,
- class G, class H, class I> inline
-void marshal(smx_simcall_t simcall, e_smx_simcall_t call,
- A&& a, B&& b, C&& c, D&& d, E&& e, F&& f, G&& g, H&& h, I&& i)
+ marshal(simcall->args[I], a);
+ marshalArgs<I+1>(simcall, b...);
+}
+
+/** Initialize the simcall */
+template<class... A> inline
+void marshal(smx_simcall_t simcall, e_smx_simcall_t call, A const&... a)