是否有可能创建一个仅为lambda的概念? 自从C++ 20以来,这些概念已经被释放来约束模板和Auto.

是否有可能创建一个仅为lambda的概念? 自从C++ 20以来,这些概念已经被释放来约束模板和Auto.,c++,lambda,c++20,c++-concepts,C++,Lambda,C++20,C++ Concepts,我想创建一个只定义lambda的概念,有可能吗 模板 概念λ=/*…*/; 然后我可以这样申请: intadd(intx,inty){ 返回x+y; } lambda auto func1=[]{return 5;};//约束满足 lambda auto func2=添加;//约束未满足的编译错误。 我不知道你为什么想要这个,但我能想到的最接近的是: template <typename T> concept lambda = requires { &T::operator

我想创建一个只定义lambda的概念,有可能吗

模板
概念λ=/*…*/;
然后我可以这样申请:

intadd(intx,inty){
返回x+y;
}
lambda auto func1=[]{return 5;};//约束满足
lambda auto func2=添加;//约束未满足的编译错误。

我不知道你为什么想要这个,但我能想到的最接近的是:

template <typename T>
concept lambda = requires { &T::operator(); };
模板
概念lambda=需要{&T::operator();};

基本上,这需要
T
有一个呼叫接线员。这是因为lambda就是这样实现的:它们为您提供一个对象,该对象的类型由编译器生成
操作符()


但是,这个概念接受的东西不是lambda,即具有调用运算符的用户定义结构,例如
std::function
std::bind
std::reference_wrapper
,等等。因此,这个概念基本上接受所有不是函数指针的可调用项,这是C++函数对象的一种奇怪的分类。

< p>在编译时可以获得“代码> t>代码>的类型名,然后确定它是否包含lambda的已损坏名称,它从<代码>开始:“我想创建一个只定义lambda的概念”,这不是你应该做的事情。C++中的lambdas不是神奇的东西;它们只是具有
操作符()
重载的类。就这样。没有理由专门针对非lambda类型保护模板实例化。没有理由强迫用户专门使用lambda,而不只是使用任何可调用对象。我们已经有了询问类型值是否可调用的方法。是的,我很难想象这个用例。当然,lambda没有什么特别之处,您所需要的只是一个可调用的对象,无论是lambda、函数地址(可能),还是从
std::bind()
返回的对象?我认为
requires
子句无法区分。您需要解决的实际问题是什么?为什么你需要这样一个概念?我只是想实现一个只有在可能的情况下才定义lambda的概念。如果不是,那没关系,因为它们只是具有重载调用运算符的类的对象。通常不可能,因为lambda与用户定义的类相比没有什么特殊之处。如果lambda是模板化的(或者如果
operator()
是重载的,这是lambda无法做到的)。
#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>();