|
38 | 38 |
|
39 | 39 | #include <gdextension_interface.h> |
40 | 40 |
|
| 41 | +#include <algorithm> |
41 | 42 | #include <array> |
42 | 43 |
|
43 | 44 | namespace godot { |
@@ -255,25 +256,33 @@ class Variant { |
255 | 256 | bool operator!=(const Variant &other) const; |
256 | 257 | bool operator<(const Variant &other) const; |
257 | 258 |
|
258 | | - void call(const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error); |
| 259 | + void callp(const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error); |
259 | 260 |
|
260 | 261 | template <class... Args> |
261 | 262 | Variant call(const StringName &method, Args... args) { |
| 263 | + std::array<Variant, sizeof...(args)> vargs = { args... }; |
| 264 | + std::array<const Variant *, sizeof...(args)> argptrs; |
| 265 | + std::transform(vargs.begin(), vargs.end(), argptrs.begin(), [](Variant &arg) -> Variant * { |
| 266 | + return &arg; |
| 267 | + }); |
262 | 268 | Variant result; |
263 | 269 | GDExtensionCallError error; |
264 | | - std::array<GDExtensionConstVariantPtr, sizeof...(Args)> call_args = { Variant(args)... }; |
265 | | - call(method, call_args.data(), call_args.size(), result, error); |
| 270 | + callp(method, argptrs.data(), argptrs.size(), result, error); |
266 | 271 | return result; |
267 | 272 | } |
268 | 273 |
|
269 | | - static void call_static(Variant::Type type, const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error); |
| 274 | + static void callp_static(Variant::Type type, const StringName &method, const Variant **args, int argcount, Variant &r_ret, GDExtensionCallError &r_error); |
270 | 275 |
|
271 | 276 | template <class... Args> |
272 | 277 | static Variant call_static(Variant::Type type, const StringName &method, Args... args) { |
| 278 | + std::array<Variant, sizeof...(args)> vargs = { args... }; |
| 279 | + std::array<const Variant *, sizeof...(args)> argptrs; |
| 280 | + std::transform(vargs.begin(), vargs.end(), argptrs.begin(), [](Variant &arg) -> Variant * { |
| 281 | + return &arg; |
| 282 | + }); |
273 | 283 | Variant result; |
274 | 284 | GDExtensionCallError error; |
275 | | - std::array<GDExtensionConstVariantPtr, sizeof...(Args)> call_args = { Variant(args)... }; |
276 | | - call_static(type, method, call_args.data(), call_args.size(), result, error); |
| 285 | + callp_static(type, method, argptrs.data(), argptrs.size(), sizeof...(args), result, error); |
277 | 286 | return result; |
278 | 287 | } |
279 | 288 |
|
|
0 commit comments