![](/img/trans.png)
[英]How can I use decltype to get the address of some class type's member function?
[英]Can I get a function's signature using decltype?
目前,我有一个这样的功能:
int get_something(int a1, int a2) {
}
// templated class which holds the address of the func and its type (return + params)
SomeClass<int(int, int)> object(&get_something);
// ^get_something's return & params types
然而,有些函数有很多参数和长类型,所以有时我必须写这样的东西:
HANDLE func(HANDLE, LPTHREAD_START_ROUTINE, LPDWORD, LPVOID, ...)
结果是:
SomeClass<HANDLE(HANDLE, LPTHREAD_START_ROUTINE, LPDWORD, LPVOID, ...)> object(&func);
我试过的是:
SomeClass<decltype(func())> ...;
但它不起作用。
有什么方法可以获取函数的签名并将其传递给对象而无需键入所有内容?
编辑这是我的实际代码。
吃入口:
template<typename ret, typename... args> class EATEntry<ret(args...)> { ... }
对象声明:
EATEntry<decltype(CreateThread)> CreateThread_f("CreateThread");
CreateThread 的签名:
WINBASEAPI
_Ret_maybenull_
HANDLE
WINAPI
CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt_ __drv_aliasesMem LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_opt_ LPDWORD lpThreadId
);
编辑2
我发现,我的代码实际工作,但它只能用我自己的功能。 如果我尝试使用某些 Windows 函数(例如CreateThread
),则会出现“类型不完整”错误。
在询问之前,您可以尝试不止一种方法。
只需要一个小的调整:不要调用函数,而是命名它:
SomeClass<decltype(func)> c;
这是一个显示它有效的示例:
#include <iostream>
void foo(int x, char y, bool z)
{
std::cout << x << y << z << '\n';
}
template <typename F>
void bar(F f)
{
f(1, '2', true);
}
int main()
{
bar<decltype(foo)>(foo);
}
当然,实际上,您可以在此处推导模板参数而不是明确给出它,但这表明decltype(foo)
是正确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.