通用的成员函数接口-模板

该博客介绍了一种在MFC中使用Lambda表达式实现消息映射的方法。作者通过创建一个模板函数`afx_msgtemplate`,使得槽函数可以接受Lambda或函数指针,并根据函数是否有返回值来决定是否返回结果。示例展示了无参数无返回值及有参数有返回值的消息映射用法,提供了一种更灵活的MFC消息处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个方案是我在编写mfc时做的,当时考虑到Qt的信号槽中,槽函数可以使用lambda来绑定,那么为什么mfc的消息映射不能呢,所以我实现了这么一个功能

代码预览

afx_msg template<auto Func,typename... Arg> constexpr auto Lambda(Arg... arg) { 

		if constexpr (std::is_same<decltype(Func(arg...)), void>::value) {
			Func(arg...);
		}
		else {
			return Func(arg...);
		}
	}

这是一个成员函数,第一个参数将会接收一个函数地址,可以是lambda,可以时函数地址,然后我使用arg作为这个函数的参数,如果函数类型没有返回值,那就只调用,不返回,否则return函数返回。

下面看一下调用

ON_COMMAND(MyBtn4,&CMyMfcSdiView::Lambda<[](){
	auto i = (MyConversion::DigitToStr<int, std::string>(34));
	AfxMessageBox(MyConversion::CharToWchar(i.data()).c_str());
		}>)

这是一段消息映射,模板参数传递了一个lambda,没有参数,没有返回值。

下面是具有参数,具有返回值的

ON_MESSAGE(12345, (& CMyMfcSdiView::Lambda <[](WPARAM a, LPARAM b)->LRESULT {
			return 1;
		},WPARAM,LPARAM>) )

由于宏展开的问题,我们这里把函数地址用小括号括起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值