29 template <MemoryIOCompatible<Args>... Ts>
30 requires(
sizeof...(Ts) ==
sizeof...(Args))
32 if (resolution_err_.has_value()) {
33 return *resolution_err_;
36 (check_arg<Ts>(), ...);
38 return prog_->call_function<Ret(Args...)>(address_, std::forward<Ts>(args)...);
44 using NormT = std::remove_cvref_t<T>;
45 static_assert(!std::is_pointer_v<NormT> && !std::is_array_v<NormT>,
46 "Passing a raw pointer as argument for an asm function, which is probably not what you meant to "
47 "do. See docs on program memory for more info.");
52 std::uintptr_t address_;
54 std::optional<ErrorKind> resolution_err_;