簡體   English   中英

可變參數模板函數確定函數指針的返回類型

[英]Variadic template function to determine function pointer return type

我有一個可變參數模板函數,它接受一個間接函數指針(及其參數)並調用它(如下所示)。 我想知道如何修改此函數,以便它可以具有與其調用的間接函數指針匹配的正確返回類型?

typedef UINT(APIENTRY *PFNFOO)(UINT, double);

class Foo
{
public:
    static UINT APIENTRY pfnFoo(UINT x, double y)
    {
        return (UINT)(x*y);
    }
};

template<typename PFN, typename... ARGS>
inline void CallFunc(void* pfn, const ARGS&... args)
{
    reinterpret_cast<PFN>(pfn) (args...);
}

int _tmain(int argc, _TCHAR* argv[])
{
    PFNFOO pfn = &Foo::pfnFoo;

    CallFunc<PFNFOO>(pfn, 100, 0.5f);
    return 0;
}

我嘗試了以下操作,但它抱怨error C2782: 'RET CallFunc(RET (__cdecl *)(ARGS...),const ARGS &...)' : template parameter 'ARGS' is ambiguous. 我想我只是缺少正確的語法,因此在此感謝您的幫助。

template<typename PFN, typename RET, typename... ARGS>
inline RET CallFunc(RET(*pfn)(ARGS...), const ARGS&... args)
{
    return reinterpret_cast<PFN>(pfn) (args...);
}

auto x = CallFunc<PFNFOO>(pfn, 100, 0.5f);

要完全扣除,可以使用以下方法:( 實時示例

template<typename Ret, typename... Params, typename...Args>
inline Ret CallFunc(Ret(*pfn)(Params...), Args&&... args)
{
    return (*pfn)(std::forward<Args>(args)...);
}

然后調用它:

CallFunc(&Foo::pfnFoo, 100, 0.5f); // float will be converted into double in CallFunc.

當您使用intfloat調用函數時,您的函數需要一個UINTdouble作為參數,因此PFNFOO的參數類型與傳遞給CallFunc的實際參數之間不匹配。 此外,無需顯式指定函數指針類型,讓編譯器推斷出它。 您的模板可以簡化為:

template<typename RET, typename... ARGS>
inline RET CallFunc(RET(*pfn)(ARGS...), ARGS&&... args)
{
    return (*pfn)(std::forward<ARGS>(args)...);
}

用法:

CallFunc(&Foo::pfnFoo, 100U, 0.5);

如果要向其傳遞intfloat ,則只需顯式指定參數類型。

CallFunc<UINT, UINT, double>(&Foo::pfnFoo, 100, 0.5f);

現場演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM