C++20 中采用模板参数的成员函数的概念

Concept for member function taking a template parameter in C++20

我想对

有一个概念
struct creatorclass {
  template<typename T>
  int fct(T val)
  {
    return 42;
  }
};

我想要的是在不指定模板参数的情况下检查函数 fct 是否存在的概念。那就是想要

template<typename U>
concept CREATOR=requires(U val) {
  val.fct;
};

我认为这是不可能的,因为一个概念需要被评估和编译。不知道 class T 就无法做到这一点。我说得对吗?

注意:Specifying a concept for a type that has a member function template using Concepts Lite 也说这是不可能的,但这是六年前 C++20 标准之前的精简概念。

据我所知,如果不评估任何模板参数,就无法测试模板成员函数。

也就是说,如果您知道允许的输入分类是什么——比如一个函数是否只能用整数值或其他东西来计算像这样——然后你可以用一个显式实例化来测试它,无论你的目的是什么,它都可以是 'good enough':

template<typename U>
concept CREATOR=requires(U val) {
  // Checks that 'val' has a 'fct' function template that works with integers
  val.template fct<int>(5); 
};

Live Example

然而,在大多数情况下,围绕履行合同所需的完整原子定义来定义概念通常更有用——在这一点上,通常最好将此评估推到 template 参数也是:

template <typename T, typename U>
concept fnc_evaluatable = requires(T val, U in) {
    val.template fct<U>(in);
};

然后在更大的作品中使用它。

在这一点上,fnc 作为模板的状态也变得不如它具有可由 U 调用的成员函数调用 fct 的状态重要 - - 并且可以简化为:

template <typename T, typename U>
concept fnc_evaluatable = requires(T val, U in) {
    val.fct(in);
};