gpt4 book ai didi

C++ 测试 lambda 函数

转载 作者:太空狗 更新时间:2023-10-29 21:38:08 25 4
gpt4 key购买 nike

我正在制作一个 Hook 库,它基本上拦截一个函数并使其跳转到拦截函数。

class CHook
{
public:

template<typename S, typename D>
void SetupHook(S Source, D Destionation)
{
pSource = (PBYTE)Source;
pDestination = (PBYTE)Destionation;
}

private:
PBYTE pSource;
PBYTE pDestination;
};

我希望 CHook::SetupHook 接受(对于目标)DWORD(函数地址)和函数指针,两者都可以类型转换为 PBYTE。

我希望 CHook::SetupHook 也能够从 lambda 获取函数指针,但不能将其类型转换为 PBYTE,所以我重载了它,因为我知道 lambda 函数是类,所以我使用 std::is_class 来识别它们。

template<typename S, typename D>
void SetupHook(S Source, typename std::enable_if<!std::is_class<D>::value, D>::type Destionation)
{
pSource = (PBYTE)Source;
pDestination = (PBYTE)Destionation;
}

template<typename S, typename D>
void SetupHook(S Source, typename std::enable_if<std::is_class<D>::value, D>::type Destionation)
{
pSource = (PBYTE)Source;
pDestination = (PBYTE)to_function_pointer(Destionation);
}

但它会导致这些错误:

error C2783: 'void CHook::SetupHook(S,std::enable_if<std::is_class<D>::value,D>::type)': could not deduce template argument for 'D'
note: see declaration of 'CHook::SetupHook'

最佳答案

当您编写如下代码时:

template <typename S, typename D>
void SetupHook(S Source, typename std::enable_if<!std::is_class<D>::value, D>::type Destionation)
{
// (...)
}

你做D不可推导的类型模板参数。即类型模板参数列表,<typename S, typename D> , 是否对应于函数的参数列表,因此,编译器无法判断它应该推导哪种类型的模板参数来代替

typename std::enable_if<!std::is_class<D>::value, D>::type

形式上,嵌套名称说明符引入了一个 non-deduced context .

解决方案是让编译器推导D , 作为普通参数类型,并放置 std::enable_if其他地方,例如:

template <typename S, typename D>
typename std::enable_if<!std::is_class<D>::value>::type SetupHook(S Source, D Destionation)
{
// (...)
}

现在,编译器看到 D是第二个参数表达式的类型。

关于C++ 测试 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36069761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com