Я использую обходные пути, и я нахожу, что актеры, которые они используют очень уродливо, поэтому я написал несколько функций шаблона, чтобы сделать кастинг для меня.Вывод шаблона не работает для ссылки на указатель функции
// Cast a function pointer to a void *
template <typename RET_TYPE, typename...ARGs>
void* fnPtrToVoidPtr(RET_TYPE(WINAPI * pOriginalFunction)(ARGs...))
{
return (void*)pOriginalFunction;
}
// Cast a function pointer that is referencable to a void *&
template <typename RET_TYPE, typename...ARGs>
void*& fnPtrRefToVoidPtrRef(RET_TYPE(WINAPI*& pOriginalFunction)(ARGs...))
{
return (void*&)pOriginalFunction;
}
Это позволяет мне сделать следующий вызов:
BOOL (WINAPI *pDestroyIcon)(HICON) = DestroyIcon;
DetourAttach(&fnPtrRefToVoidPtrRef(pDestroyIcon), fnPtrToVoidPtr(DestroyIcon));
Однако, мне было интересно, если я мог бы объединить два названия функций fnPtrRefToVoidPtrRef
и fnPtrToVoidPtr
в одно имя.
Выполнение следующих не работает, поскольку она не может вывести аргументы шаблона:
// Cast a function pointer to a void *
template <typename RET_TYPE, typename...ARGs>
void* fnPtrToVoidPtr(RET_TYPE(WINAPI * & pOriginalFunction)(ARGs...))
{
return (void*)pOriginalFunction;
}
// Cast a function pointer that is referencable to a void *&
template <typename RET_TYPE, typename...ARGs>
void*& fnPtrToVoidPtr(RET_TYPE(WINAPI * && pOriginalFunction)(ARGs...))
{
return (void*&)pOriginalFunction;
}
BOOL (WINAPI *pDestroyIcon)(HICON) = DestroyIcon;
void* p1 = fnPtrToVoidPtr(DestroyIcon);
void** p2 = &fnPtrToVoidPtr(pDestroyIcon);
вызывает следующую ошибку:
// error C2784: 'void *&fnPtrToVoidPtr(RET_TYPE (__stdcall *&&)(ARGs...))' : could not deduce template argument for 'overloaded function type' from 'overloaded function type'
Используя свои первоначальные функции, это работает отлично:
BOOL (WINAPI *pDestroyIcon)(HICON) = DestroyIcon;
void* p1 = fnPtrToVoidPtr(DestroyIcon);
void** p2 = &fnPtrRefToVoidPtrRef(pDestroyIcon);
Однако, если я изменю fnPtrRefToVoidPtrRef
на это:
// Cast a function pointer that is referencable to a void *&
template <typename RET_TYPE, typename...ARGs>
void*& fnPtrRefToVoidPtrRef(RET_TYPE(WINAPI*&& pOriginalFunction)(ARGs...))
{
return (void*&)pOriginalFunction;
}
Я получаю следующее сообщение об ошибке:
error C2664: 'void *&fnPtrRefToVoidPtrRef<BOOL,HICON>(RET_TYPE (__stdcall *&&)(HICON))' : cannot convert argument 1 from 'BOOL (__stdcall *)(HICON)' to 'BOOL (__stdcall *&&)(HICON)'
который, кажется, почему он не может сделать вывод шаблона, он не признает его, чтобы быть того же типа (или кабриолет?). Есть ли способ заставить C++ правильно выводить указатель на функцию?
Я пытался понять это на пару дней! Конечно, вычет шаблона не работает, если он должен принуждать тип. Это имеет такое значение. СПАСИБО! – Adrian