目前,我有这样的功能:
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
然而,有一些功能有很多参数&amp;长类型,所以有时候我必须写下这样的东西:
HANDLE func(HANDLE, LPTHREAD_START_ROUTINE, LPDWORD, LPVOID, ...)
结果是:
SomeClass<HANDLE(HANDLE, LPTHREAD_START_ROUTINE, LPDWORD, LPVOID, ...)> object(&func);
我尝试的是:
SomeClass<decltype(func())> ...;
但它没有用。
有没有办法获取函数的签名并将其传递给对象而无需输入所有内容?
修改 这是我的实际代码。
EATEntry:
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
);
EDIT2
我发现我的代码确实有用,但它只使用我自己的功能 。如果我尝试使用某些Windows功能(例如CreateThread
),我会得到一个&#34;不完整的类型&#34;错误。
答案 0 :(得分:1)
在询问之前,您可能只尝试过一种方法。
只需稍微调整一下:不要调用该函数,而是将其命名为:
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)
是正确的。