如何创建一个C ++宏来定义使用调用另一个函数的参数列表的函数?

塞缪尔·图拉奇

标题看起来很奇怪,我想做的很简单。查看以下定义:

ImportFunc(void, il2cpp_init_utf16, (const Il2CppChar* domain_name));
ImportFunc(void, il2cpp_shutdown, ());
ImportFunc(void, il2cpp_set_config_dir, (const char* config_path));
ImportFunc(void, il2cpp_set_data_dir, (const char* data_path));
ImportFunc(void, il2cpp_set_commandline_arguments, (int argc, const char* const argv[], const char* basedir));
ImportFunc(void, il2cpp_set_commandline_arguments_utf16, (int argc, const Il2CppChar* const argv[], const char* basedir));
ImportFunc(void, il2cpp_set_config_utf16, (const Il2CppChar* executablePath));
ImportFunc(void, il2cpp_set_config, (const char* executablePath));

我有很多这样的定义,我想“将它们变成函数”。我已经尝试过这样的事情:

#define ImportFunc(t, n, a) \
t n a \
{ \
void* pfunc = (void*)CallSystem(kernel32, GetProcAddress, Globals::GameAssembly, n); \
return SpoofCall<type>((void*)pfunc, args...); \
}

问题是如何解析函数参数并将其传递给另一个函数。SpoofCall函数的确如下所示:

template<typename Ret = void, typename First = void*, typename Second = void*, typename Third = void*, typename Fourth = void*, typename... Stack>
    __forceinline Ret SpoofCall(void* Func, First a1 = First{}, Second a2 = Second{}, Third a3 = Third{}, Fourth a4 = Fourth{}, Stack... args) {

有没有办法做到这一点?我可以定义要接受模板的函数,然后仅使用这些参数调用SpoofCall,但是我想用参数定义函数,以便我可以更轻松地使用它们并将它们与IntelliSense集成:

屏幕截图

编辑:更改了宏中的错字

零号

您可以尝试类似:

#define ImportFunc(_type,_name,...) \
        _type (&x_##_name) (__VA_ARGS__) = *ImportT<_type,## __VA_ARGS__>(#_name)

// Convenience typedef, as spelling template function
// returning template pointer to function
// is *too* error-prone otherwise
template <typename Ret, typename ...Args>
using FuncT = Ret (Args...);

template <typename Ret, typename ...Args>
FuncT<Ret, Args...> *ImportT(char const *name) {
        std::printf("Name: %s\n", name);
        return (FuncT<Ret, Args...> *)dlsym(RTLD_DEFAULT, name); // GetProcAddress on windows
}       

ImportFunc(double, sin, double);
ImportFunc(double, sqrt, double);
ImportFunc(int, fn3, float);

int main() {
        printf("sin(1) = %.3f\n", x_sin(1.0f));
        printf("sqrt(2) = %.3f\n", x_sqrt(2.0f));
}

该符号将引用功能而不是功能,但是IntelliSense应该接受。该引用将在程序启动时初始化。允许参数名称更成问题,但是使用更多的函数重载魔术应该可以实现(有关更多信息,请参见CppReference文章)。

编辑:它确实更简单,就像float (int a, int b)C ++中的有效类型一样

#define ImportFunc(_type,_name,...) \
        _type (&x_##_name) (__VA_ARGS__) = *ImportT<_type (__VA_ARGS__)>(#_name)

template <typename Func>
Func *ImportT(char const *name) {
        std::printf("Name: %s\n", name);
        return (Func *)dlsym(RTLD_DEFAULT, name); // GetProcAddress on windows
}       

ImportFunc(double, sin, double t);
ImportFunc(double, sqrt, double x);
ImportFunc(int, fn3, float a, char const * b);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用参数列表调用另一个函数的函数不起作用

来自分类Dev

如何在函数内定义变量并使用它来调用另一个函数

来自分类Dev

如何创建一个 Excel 宏来停止另一个宏并重新调用它?

来自分类Dev

C ++函数调用缺少参数列表;使用'&Runner :: runTask'创建一个指向成员的指针

来自分类Dev

如何在Python中使用另一个函数调用带有参数的函数

来自分类Dev

另一个使用引用和参数的函数中的C ++调用函数

来自分类Dev

如何使用cfc对象的引用从另一个函数调用一个函数?

来自分类Dev

如何使用一个函数调用另一个函数?

来自分类Dev

如何提取可变参数函数的一组选定参数并使用它们来调用另一个函数

来自分类Dev

如果定义了一个函数,则单行调用,否则调用另一个函数

来自分类Dev

Haskell-将任意函数和参数列表作为参数传递给另一个函数

来自分类Dev

为什么在调用另一个函数时不能将一个函数定义为参数?

来自分类Dev

C ++如何使用从一个函数到另一个函数的变量?

来自分类Dev

当我使用预定义函数定义另一个函数时,RaiseError被调用

来自分类Dev

如何在VBA中使用另一个宏/函数(UDF)调用对象/宏/用户窗体?

来自分类Dev

从另一个函数C#调用另一个函数

来自分类Dev

如何乘/除一个函数到另一个?如何使用参数?

来自分类Dev

如何使用另一个类的公共成员函数作为参数调用线程

来自分类Dev

如何在react native中使用另一个类的参数调用函数?

来自分类Dev

如何在调用另一个宏时使用宏参数?

来自分类Dev

在另一个函数中调用列表 - Python

来自分类Dev

使用另一个QML对象作为参数从C ++调用QML函数

来自分类Dev

如何调用另一个函数内部的函数?

来自分类Dev

如何从函数调用到另一个函数

来自分类Dev

比在另一个函数的参数中调用一个函数更昂贵?

来自分类Dev

比在另一个函数的参数中调用一个函数更昂贵?

来自分类Dev

在另一个函数中调用一个函数的参数

来自分类Dev

另一个函数内部的C ++调用函数

来自分类Dev

如何使用另一个宏创建 C 宏名称?

Related 相关文章

  1. 1

    使用参数列表调用另一个函数的函数不起作用

  2. 2

    如何在函数内定义变量并使用它来调用另一个函数

  3. 3

    如何创建一个 Excel 宏来停止另一个宏并重新调用它?

  4. 4

    C ++函数调用缺少参数列表;使用'&Runner :: runTask'创建一个指向成员的指针

  5. 5

    如何在Python中使用另一个函数调用带有参数的函数

  6. 6

    另一个使用引用和参数的函数中的C ++调用函数

  7. 7

    如何使用cfc对象的引用从另一个函数调用一个函数?

  8. 8

    如何使用一个函数调用另一个函数?

  9. 9

    如何提取可变参数函数的一组选定参数并使用它们来调用另一个函数

  10. 10

    如果定义了一个函数,则单行调用,否则调用另一个函数

  11. 11

    Haskell-将任意函数和参数列表作为参数传递给另一个函数

  12. 12

    为什么在调用另一个函数时不能将一个函数定义为参数?

  13. 13

    C ++如何使用从一个函数到另一个函数的变量?

  14. 14

    当我使用预定义函数定义另一个函数时,RaiseError被调用

  15. 15

    如何在VBA中使用另一个宏/函数(UDF)调用对象/宏/用户窗体?

  16. 16

    从另一个函数C#调用另一个函数

  17. 17

    如何乘/除一个函数到另一个?如何使用参数?

  18. 18

    如何使用另一个类的公共成员函数作为参数调用线程

  19. 19

    如何在react native中使用另一个类的参数调用函数?

  20. 20

    如何在调用另一个宏时使用宏参数?

  21. 21

    在另一个函数中调用列表 - Python

  22. 22

    使用另一个QML对象作为参数从C ++调用QML函数

  23. 23

    如何调用另一个函数内部的函数?

  24. 24

    如何从函数调用到另一个函数

  25. 25

    比在另一个函数的参数中调用一个函数更昂贵?

  26. 26

    比在另一个函数的参数中调用一个函数更昂贵?

  27. 27

    在另一个函数中调用一个函数的参数

  28. 28

    另一个函数内部的C ++调用函数

  29. 29

    如何使用另一个宏创建 C 宏名称?

热门标签

归档