这个方案是我在编写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>) )
由于宏展开的问题,我们这里把函数地址用小括号括起来。