C++测试lambda是否正常工作
C++ test if lambda function
我正在制作一个钩子库,它基本上拦截了一个函数并使其跳转到拦截函数。
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
从形式上讲,嵌套名称说明符引入了非推导上下文。
解决方案是让编译器推断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
是第二个参数表达式的类型。
有点像黑客技巧,但您可以使用 unary+ 将 lambda 转换为函数指针。 请注意,如果 lambda 捕获任何变量,则无法将其转换为函数指针。
template<typename S, typename D>
void SetupHook(S Source, D Destionation)
{
pSource = (PBYTE)Source;
// static_cast is required for avoiding Visual Studio bug
pDestination = (PBYTE)+static_cast<void(*)()>(Destionation);
}
。
void some_func() {}
int main() {
auto str = "hello";
auto some_lambda = [](){};
auto some_capturing_lambda = [=]() {
std::cout << str;
};
SetupHook(str, some_func); // Works
SetupHook(str, some_lambda); // Works
SetupHook(str, some_capturing_lambda); // Error in Unary Expression
}
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- sdl软件渲染器不工作,工作在硬件加速的一个
- C++程序已停止工作-求解常微分方程