代码之家  ›  专栏  ›  技术社区  ›  no one special

C++:将多态lambda传递给函数

  •  3
  • no one special  · 技术社区  · 8 年前

    我想传递一个多态lambda函数,它将执行某些操作(即 == <= < 在不同的数据类型上。所以我想做这样的手术:

    bool func(bool (* f)(auto a, auto b))
    {
        int a = 1, b = 2;
        float c = 3, d = 4;
        return f(a, b) || f(c, d);
    }
    

    要以后像这样执行它:

    func([](auto a, auto b) -> bool { return a == b; });
    func([](auto a, auto b) -> bool { return a <= b; });
    func([](auto a, auto b) -> bool { return a < b; });
    

    但不幸的是,用这种方式声明函数指针(参数类型为 auto )不允许。我该怎么做才好?

    3 回复  |  直到 7 年前
        1
  •  6
  •   o11c    8 年前

    这很好用:

    template<class F>
    bool func(F f)
    {
        int a = 1, b = 2;
        float c = 3, d = 4;
        return f(a, b) || f(c, d);
    }
    
    int main()
    {
        func([](auto a, auto b) -> bool { return a == b; });
        func([](auto a, auto b) -> bool { return a <= b; });
        func([](auto a, auto b) -> bool { return a < b; });
    }
    
        2
  •  2
  •   Marek R    8 年前

    没有模板 auto 函数参数中的关键字没有意义。 要么将其作为模板,要么提供特定类型:

    bool func(bool (* f)(int a, int b))
    {
        int a = 1, b = 2;
        float c = 3, d = 4;
        return f(a, b) || f(c, d);
    }
    
    template<class T>
    bool func2(T f)
    {
        int a = 1, b = 2;
        float c = 3, d = 4;
        return f(a, b) || f(c, d);
    }
    
    …
    func([](auto a, auto b) -> bool { return a <= b; });
    func3([](auto a, auto b) -> bool { return a <= b; });
    

    https://wandbox.org/permlink/cbit5S26a5pyrULf

        3
  •  1
  •   no one special    8 年前

    好的,我找到了答案。更奇怪的是,我希望 func 函数也必须是这样的lambda函数:

    auto func = [](auto f) -> bool
    {
        int a = 1, b = 2;
        float c = 3, d = 4;
        return f(a, b) || f(c, d);
    };