如何编写一个返回新仿函数的boost :: lambda仿函数
如何编写带有两个占位符的lambda表达式,一个用于可调用对象,另一个用于函数参数,这样首先提供可调用对象将返回一元函数。
在下面的示例中,
generate
应该是一个lambda表达式,其中第一个占位符是可调用对象本身,第二个占位符是参数。调用generate(c)
应该返回一个只缺少函数调用参数的一元函数。实际上,它已经以某种方式返回类型bool
,正如静态断言所证明的那样。
#include <boost/lambda/bind.hpp>
struct Arg {
};
struct Callable : std::unary_function<Arg, bool> {
bool operator()( Arg const& a ) const { return true; }
};
int main( int argc, const char* argv[] ) {
BOOST_AUTO(generate, boost::lambda::bind(boost::lambda::_1, boost::lambda::protect(boost::lambda::_1)));
Callable c;
BOOST_AUTO(fn, generate(c));
BOOST_STATIC_ASSERT((boost::is_same<BOOST_TYPEOF(fn), bool>::value));
Arg a;
bool b = fn(a);
_ASSERT(b==true);
}
没有找到相关结果
已邀请:
3 个回复
才脊烽馈低
并不是说这个解决方案比OT发布的版本更通用。它可以与任何一元函数对象一起使用,无论什么参数,无论返回类型如何。 缺点是,你需要使用当前的升压干线......
勺的驴吓识
当然,在这个简单的例子中,我可以写
,因为
本身就是可调用的对象。但我正在寻找一种方法来预先设置
的参数,因此生成的函数
是一个无效函数。这个解决方案让我在
里面这样做。
也可能被删除,但我还没有弄清楚如何定义指向重载全局函数的指针
。
蕾跨立锌煤
话虽这么说,可能这不像提问者那么漂亮 预计... 正如您所提到的,如果我们指定
的一个重载 明确地说,不需要
。 但是,就我所见,似乎没有可移植的指定方式 超载。 所以,在这种情况下,我们可能必须依赖于
的内部。 为了您的信息,我测试时可以编译以下代码:
希望这可以帮助