从已声明的函数创建函数指针
Make function pointer from an already declared function
我有一个声明为 int __stdcall MyFunction(int param, int param);
的函数,当名称作为参数传递时,我需要在宏或模板中获取指向该函数的指针类型。
这在C++中是可能的,还是我必须自己重写函数签名?
您可以通过以下方式为函数指针(它衰减到该指针,或由 address-of 运算符返回(创建类型别名:
#include <iostream>
int MyFunction(int param, int param1)
{
std::cout << param << " " << param1 << std::endl;
return 0;
}
using Myfunction_ptr_t = std::decay<decltype(MyFunction)>::type;
// or using Myfunction_ptr_t = decltype(&MyFunction);
// or using Myfunction_ptr_t = decltype(MyFunction) *;
int main()
{
Myfunction_ptr_t Myfunction_ptr = MyFunction;
Myfunction_ptr(1, 2);
}
此示例应改为使用 auto
说明符(自 C++ 11 起(:
auto Myfunction_ptr = MyFunction;
但这在不可推导的上下文中无济于事。
函数指针的行为与其他指针类似。它是一个指向某个实体(在本例中为函数代码(的内存地址。您可以将这些指针保存在某个地方,然后以任何方便您的情况的方式获取它们。
例如,您可以创建 std::string vs fun 的静态映射。 指针对:
static std::map<std::string, PTR_TYPE> funMap;
之后保存指向此地图的指针,并在需要时检索它们。
如果你还没有指针,你可能说的是从库中导出的函数。在这种情况下,请查看ldd用于基于*nix或somethig simialar用于其他平台。您需要搜索运行时链接器信息,并按名称查找 fnction。
实际上我不明白为什么你说你不能链接到这些功能。以标准方式执行此操作:包含带有此类声明的头文件。使用声明。链接器将为您完成工作。只需为它提供具有这些功能的库路径即可。它将动态链接到所需的功能。这就是你应该做的。如果你没有这样的库,你需要在运行时(再次(链接器的帮助下在运行时手动搜索函数。
您可以定义如下所示的typedef
:
typedef int (__stdcall *MYFUN)(int, int);
测试用例:
int main() {
MYFUN f = MyFunction;
f(2, 3);
}
或者,您可以使用std::function
对象作为波纹管:
std::function<decltype(MyFunction)> myfun;
测试用例:
std::function<decltype(MyFunction)> myfun = MyFunction;
myfun(4, 5);
现场演示
知道了。 decltype(FunctionName)* pointer;
会完成这项工作。
decltype
或auto
,如下所示
decltype(&FunctionName) pointer = &FunctionName;
或
auto pointer = &FunctionName;
我避免手动将函数指针转换为自己在 C++11 和 C++14 中键入:)
- 通过构造函数创建的所有对象都具有相同的向量
- 通过构造函数创建一些值并尝试添加到文档中使用 rapidjson 不起作用
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- C++ :: 如何捕获由 void 函数创建的矩阵
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 用于基于成员字段或函数创建比较器的快捷方式
- std::使用类成员函数创建线程 - 最佳实践
- 为C++重载函数创建SWIG类型映射
- 使用成员函数创建std::函数不会编译
- 如何为返回特定类型的函数创建 SWIG 类型图
- 为具有多个参数的函数创建 SWIG 类型图的更简单方法?
- 通过另一个宏创建的函数创建所有列表的宏
- std::map<int, A> 运算符 [] 需要使用空构造函数创建 A
- 无法使用 CreateWindowEx 函数创建窗口
- c++ 从成员函数创建新线程并移动对象和整个对象
- 无法使用 c++ 中的类成员函数创建/写入文件
- 使用makeword函数创建错误e0109-表观呼叫的括号前表达式必须具有(指针到 - )函数类型
- 为 OpenMP 函数创建别名 ||部分禁用 openMP
- 稍后使用<Class>调用类构造函数创建 std::vector