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

时间:2018-07-14 16:56:10

标签: c++ lambda c++14

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

<=

稍后再执行以下操作:

<

但是不幸的是,不允许这样声明函数指针(参数类型为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); } )。我应该如何正确执行此操作?

3 个答案:

答案 0 :(得分:6)

这很好用:

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; });
}

答案 1 :(得分:2)

在函数参数中没有模板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://e-civic.coquitlam.ca/tempestprod/webinquiry/frames.cfm

答案 2 :(得分:1)

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

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