gpt4 book ai didi

c++ - 在不使用 lambda 的情况下,我如何巧妙地创建一个给定表达式的函数?

转载 作者:行者123 更新时间:2023-11-28 07:54:29 27 4
gpt4 key购买 nike

希望能够做类似的事情

std::map<EventType, boost::function<bool(int,int)>  callbackMap;
callbackMap[EVENT1] = boost::bind( magic_creator( this->m_isHerp && !this->m_isDerp ) , _1, _2 );

基本上为 magic_creator 提供一个计算结果为 true 或 false 的表达式,它返回一个我可以使用 boost 绑定(bind)的函数。所以在上面的例子中,magic_creator 会创建一个不管_1 和_2 都会返回 true 的函数。我无法使用 lamdas,因为它对我没有用。有人对此有任何帮助吗?

P.S 假设 callbackMap 是某个类的一部分,因此是上述代码的当前范围。

最佳答案

这实际上是可能的,而不是那个 Boost Lambda Library , Boost.BindBoost.Phoenixbind .

从任何这些库调用 bind 返回的所有占位符和 Binder 类型都将重载各种运算符,因此您可以轻松地“即时”创建表达式。使用 Boost.Bind:

#include <iostream>
#include <boost/bind.hpp>

struct X{ bool a, b; };

int main(){
using boost::bind;
auto op = bind(&X::a, _1) && !bind(&X::b, _1);
X x{true, false};
auto test = bind(op, x);
if(test())
std::cout << "Yay\n";
}

Live example.

当然,这具有通过成员指针的明显缺点。此外,在 C++03 中,你在写出这样一个“lambda”的类型时遇到了很大的问题,因为它是一个巨大的模板化困惑。上面的小例子会产生一个巨大的名字,可以看出 here .由于库解决方案不是“最好的”,标准委员会将 lambda 添加到语言中。是的。

请注意,虽然 C++11 的 std::bind 表面上看起来很相似,但它是一个纯绑定(bind)器。它不允许您即时创建表达式,因为它不会为任何相关类型重载任何运算符。

关于c++ - 在不使用 lambda 的情况下,我如何巧妙地创建一个给定表达式的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13040880/

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