c++ - 如何推断类型是否为 lambda?
问题描述
如何推断类型是 lambda ?喜欢std::is_function
?我也试过std::is_invocable
,但它需要确切的参数类型。
解决方案
如果没有确切的参数,您无法检查每个可调用类型。以此为例:
auto my_lambda = [](std::integral auto number) {};
在不知道参数类型的情况下,有几个属性很难检查:
operator()
由于它是模板,因此您不能获取地址。您可以获取地址,operator()<int>
但您必须提前知道类型- 您不能尝试使用“转换为任何东西”类型的 lambda,因为它不是一个整体
- 没有其他可以观察到的类型的可观察属性。
这使得很难拥有一个is_lambda
特质。此外,你可以有这样的东西:
struct A {
void operator()(int) const {}
};
这与 lambda 无法区分。
然而,有一些非常神秘的方法可以检查一个类型是否是 lambda。
我强烈建议不要这样做。
理论上,您可以使用__PRETTY_FUNCTION
or来检查类型的名称__FUNCSIG__
,并检查该名称是否看起来像编译器为 lambda 生成的名称,但这会排除任何其他用户定义的可调用类型,这些类型是并且应该像 lambda 一样被接受。
我将实现作为练习留给读者。
推荐阅读
- django - Add dynamic attribute to serializer
- google-apps-script - 解决“解析错误:请检查您的选择器。(第 XX 行)'Javascript/AWQL AdWords 数据抓取器
- reactjs - 如何在 ReactJs 中更新嵌套状态
- python - 在 AutoCAD 中使用项方法查找块
- javascript - 将路径从 webpack 更改为 firebase 以进行部署?
- javascript - 无法将活动类添加到网站上的按钮
- python - IndexError:使用自定义函数时列表分配索引超出范围
- c# - 替换 C# 中的字符串模式
- c++ - for循环中的多个输入
- react-native - 如何增加触摸面积?