[英]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.
當您使用int
和float
調用函數時,您的函數需要一個UINT
和double
作為參數,因此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);
如果要向其傳遞int
和float
,則只需顯式指定參數類型。
CallFunc<UINT, UINT, double>(&Foo::pfnFoo, 100, 0.5f);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.