可以表达 lambda 表达式的“类型”吗?

新手上路,请多包涵

将 lambda 表达式视为可调用对象的“语法糖”,可以表达未命名的底层类型吗?

一个例子:

 struct gt {
    bool operator() (int l, int r) {
        return l > r;
    }
} ;

现在, [](int l, int r) { return l > r; } 是上述代码的优雅替代品(加上必要的 gt 可调用对象的创建),但有没有办法表达 gt(类型)本身?

一个简单的用法:

 std::set<int, gt> s1;  // A reversed-order std::set
// Is there a way to do the same using a lambda?
std::set<int, some-magic-here-maybe([](int l, int r) { return l > r; }) > s2;

原文由 Yehoshafat Hashiloni 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 352
2 个回答

不,您不能将其放入 decltype 因为

lambda 表达式不应出现在未计算的操作数中

您可以执行以下操作

auto n = [](int l, int r) { return l > r; };
std::set<int, decltype(n)> s(n);

但这真的很丑。请注意,每个 lambda 表达式都会创建一个新的唯一类型。如果之后您在其他地方执行以下操作,则 t 的类型不同于 s

 auto m = [](int l, int r) { return l > r; };
std::set<int, decltype(m)> t(m);

您可以在此处使用 std::function ,但请注意,这会产生一点运行时成本,因为它需要间接调用 lambda 函数对象调用运算符。它在这里可能可以忽略不计,但如果您想以这种方式将函数对象传递给 std::sort 可能会很重要。

 std::set<int, function<bool(int, int)>> s([](int l, int r) { return l > r; });

与往常一样,首先是代码,然后是配置文件:)

原文由 Johannes Schaub - litb 发布,翻译遵循 CC BY-SA 4.0 许可协议

直接回答你的问题:没有。

您需要使用可从任何类型分配的东西,类似于具有明确定义类型的仿函数。一个示例是 sbi 的答案中所示的 std::function 。然而,这不是 lambda 表达式的类型。

原文由 Edward Strange 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题