首页 > 解决方案 > 是否可以创建一个只有 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.

标签: c++lambdac++20c++-concepts

解决方案


您可以在编译时获取类型名称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>();

演示。


推荐阅读