首页 > 解决方案 > 如何推断类型是否为 lambda?

问题描述

如何推断类型是 lambda ?喜欢std::is_function?我也试过std::is_invocable,但它需要确切的参数类型。

标签: c++c++20

解决方案


如果没有确切的参数,您无法检查每个可调用类型。以此为例:

auto my_lambda = [](std::integral auto number) {};

在不知道参数类型的情况下,有几个属性很难检查:

  • operator()由于它是模板,因此您不能获取地址。您可以获取地址,operator()<int>但您必须提前知道类型
  • 您不能尝试使用“转换为任何东西”类型的 lambda,因为它不是一个整体
  • 没有其他可以观察到的类型的可观察属性。

这使得很难拥有一个is_lambda特质。此外,你可以有这样的东西:

struct A {
    void operator()(int) const {}
};

这与 lambda 无法区分。


然而,有一些非常神秘的方法可以检查一个类型是否是 lambda。

我强烈建议不要这样做

理论上,您可以使用__PRETTY_FUNCTIONor来检查类型的名称__FUNCSIG__,并检查该名称是否看起来像编译器为 lambda 生成的名称,但这会排除任何其他用户定义的可调用类型,这些类型是并且应该像 lambda 一样被接受。

我将实现作为练习留给读者。


推荐阅读