c++ - 是否可以创建一个只有 lambda 的概念?
问题描述
从 C++ 20 开始,这些概念已经发布以约束模板和自动。
我想创建一个只定义 lambda 的概念,这可能吗?
template <typename T>
concept lambda = /* ... */ ;
然后我可以这样申请:
int add(int x, int y) {
return x + y;
}
lambda auto func1 = []{ return 5; }; // constrain satisfied
lambda auto func2 = add; // constrain unsatisfied, compilation error.
解决方案
您可以在编译时获取类型名称T
,然后确定它是否包含 lambda 的错位名称,<lambda
在 gcc 和(lambda
clang 中以开头:
虽然可行,但实际上并不推荐。
#include <string_view>
template <typename T>
consteval bool is_lambda() {
std::string_view name = __PRETTY_FUNCTION__;
auto pos = name.find("T = ");
name.remove_prefix(pos + 4);
if (pos = name.rfind("::"); pos != name.npos)
name.remove_prefix(pos + 2);
#ifdef __clang__
return name.starts_with("(lambda");
#elif defined(__GNUC__)
return name.starts_with("<lambda");
#endif
}
template <class T>
concept lambda = is_lambda<T>();
推荐阅读
- java - 将数据发送到队列并在同一函数中侦听数据
- firebase - 设置用户属性后如何获取更新的远程配置值
- spark-streaming - 如何在转换为 DF 期间从 kafka 添加时间戳以触发流式传输
- batch-file - 如何将带有空格的目录路径传递给 .cmd 脚本?
- excel - 合并两个“Private Sub Worksheet_Change(ByVal Target As Range)”
- java - 如何运行一个简单的 for 循环而不是重复的 if 语句?
- python - 具有不平衡类(正数是少数类)、低精度和奇怪的分数分布的随机森林
- android - Android 模拟器网络问题
- macos - 在 sed 中拆分第二次出现的骆驼样式文本模式
- java - 如何使用 Selenium 获取 Chrome 浏览器控制台日志 [INFO] 条目