我可以使用decltype获得函数的签名吗?

时间:2015-07-04 16:47:08

标签: c++

目前,我有这样的功能:

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;错误。

1 个答案:

答案 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);
}

live demo

当然,实际上,您可以在此处推断模板参数而不是明确地给出它,但这表明decltype(foo)是正确的。