有没有一种方法可以使用typedef中的参数名称

Is There a way to use the Parameter Names from a typedef

本文关键字:typedef 参数 可以使 方法 一种 有没有      更新时间:2023-10-16

给定一个typedef,它定义了一个函数指针,参数名称如下:

typedef void(*FOO)(const int arg);

有没有一种方法可以让我使用这个函数指针来定义函数的签名?显然,这是行不通的,但我想以某种方式使用typedef来指定具有相应类型的函数签名:

FOO foo {
cout << arg << endl;
}

再说一遍,我知道这不起作用,而且语法不好。它只会给出错误:

错误:未在此作用域中声明arg

您试图做的事情不会奏效。FOOvoid(*)(const int)的别名。所以

FOO foo {
cout << arg << endl;
}

成为

void(*)(const int) foo {
cout << arg << endl;
}   

但这根本不起作用。不过,您可以定义一个使用名称的宏,并使用该名称来标记函数签名。看起来像

#define MAKE_FUNCTION(NAME) void NAME(const int arg)
MAKE_FUNCTION(foo){ std::cout << arg * 5 << "n"; }
MAKE_FUNCTION(bar){ std::cout << arg * 10 << "n"; }
int main()
{
foo(1);
bar(2);
}

函数指针的定义与声明无关,也与函数的定义无关,因此答案是否定的。

您实际上可以做到这一点。您可以通过将自动lambda分配给类型来滥用lambda来克隆函数。缺点是您无法访问参数名称,而必须通过索引访问参数。

https://github.com/stevemk14ebr/PolyHook_2_0/blob/350f6723f0c12b93085273fc4a5208aaa36bf41a/polyhook2/IHook.hpp#L67-L150

这是一个用法示例https://github.com/stevemk14ebr/PolyHook_2_0/blob/350f6723f0c12b93085273fc4a5208aaa36bf41a/UnitTests/windows/TestDetourx64.cpp#L22-L41