【问题标题】:Concept for member function taking a template parameter in C++20 [duplicate]在 C++20 中采用模板参数的成员函数的概念 [重复]
【发布时间】:2021-04-14 13:25:16
【问题描述】:

我想有个概念

struct creatorclass {
  template<typename T>
  int fct(T val)
  {
    return 42;
  }
};

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

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

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

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

【问题讨论】:

  • 是的,这是不可能的。
  • 不清楚你到底想要什么...你想验证一个泛型函数的存在(零个或多个参数;模板与否)?或者存在一个模板函数只接收一个参数(模板类型)?或者还有什么?
  • 这取决于fct成员函数的签名。要检查它是否存在,您需要知道如何调用它,或者它需要多少个参数以及这些参数是什么类型。
  • 因为模板可能是专门的或受限制的,您需要更具体地了解如何调用fct(例如,什么类型?)
  • 我认为这个问题没有用适当的欺骗目标结束。

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


【解决方案1】:

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

也就是说,如果您知道允许输入的分类是什么——例如,如果一个函数只能用整数值或类似的东西来评估——那么您可以使用显式实例化对其进行测试,无论您的目的是什么,这可能“足够好”:

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);
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-29
    • 2018-12-28
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    相关资源
    最近更新 更多