【问题标题】:Using boost to create a lambda function which always returns true使用 boost 创建一个始终返回 true 的 lambda 函数
【发布时间】:2010-08-24 15:25:49
【问题描述】:

假设我有一个采用某种谓词形式的函数:

void Foo( boost::function<bool(int,int,int)> predicate );

如果我想用一个总是返回 true 的谓词来调用它,我可以定义一个辅助函数:

bool AlwaysTrue( int, int, int ) { return true; }
...
Foo( boost::bind( AlwaysTrue ) );

但是无论如何都可以调用这个函数(可能使用 boost::lambda)而不必定义一个单独的函数?

[编辑:忘了说:我不能使用 C++0x]

【问题讨论】:

    标签: c++ boost lambda c++03


    【解决方案1】:

    UncleBens 在 Scharron 的回答中对此发表了评论,但我认为这实际上是最好的答案,所以我正在窃取它(对不起 UncleBens)。只需使用

    Foo(boost::lambda::constant(true));
    

    the documentation for Boost.Lambda 中所述,只有函子的最小元数为零,最大元数是无限的。所以传递给函子的任何输入都将被忽略。

    【讨论】:

    • 我自己一直在看,发现 boost::lambda::identity... 有人知道区别吗?它们似乎都有效。
    • identity 似乎是一个未记录的模板类,用于实现常量(和 boost::lambda::var)。很像 std::mem_fun_t 是辅助函数 std::mem_fun 创建和返回的类,除了 mem_fun_t 已记录而 identity 没有。鉴于此,我建议改用 var 和 constant。
    【解决方案2】:

    这是一个简单的例子:

    #include <boost/function.hpp>
    #include <boost/lambda/lambda.hpp>
    #include <iostream>
    
    void Foo( boost::function<bool(int,int,int)> predicate )
    {
      std::cout << predicate(0, 0, 0) << std::endl;
    }
    
    int main()
    {
      using namespace boost::lambda;
      Foo(true || (_1 + _2 + _3));
    }
    

    诀窍是在 true || (_1 + _2 + _3) 中创建一个带有 3 个参数(_1_2_3)的 boost lambda,始终返回 true

    【讨论】:

    • 我对 lambda 的了解还不够,无法实际回答,但我认为“Foo(true || _3)”也可以使用
    • 看来你甚至可以这样做:Foo(constant(true)); 这是无效的,但这只是函子的最小数量。
    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2018-08-02
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多