【问题标题】:C++: Passing polymorphic lambda to a functionC++:将多态 lambda 传递给函数
【发布时间】:2018-07-14 16:56:09
【问题描述】:

我想传递一个多态 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 类型的参数)。我应该如何正确地做到这一点?

【问题讨论】:

  • 使用模板,带有任意函子而不是专门的指针。
  • @o11c 这并没有解决根本问题。
  • @Sneftel:它处理能够将函数传递给其他函数的问题。而如果func真正采用这些概念性的auto参数,那么func已经是一个模板

标签: c++ lambda c++14


【解决方案1】:

这很好用:

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】:

函数参数中没有模板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】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多