当前位置: 首页 > 知识库问答 >
问题:

使用概念Lite为具有成员函数模板的类型指定概念

荣曾笑
2023-03-14

这是怎么做到的?

示例:假设我有较高的kinded类型HKT,其中有一个成员函数模板F:

template<class T>
struct HKT {
  template<class U> // this looks like e.g. rebind in std::allocators
  auto F(U) -> HKT<U>;
};

现在我想指定一个概念来约束这些更高级别的类型:

template <template <class> class HKT, class T>
concept HKTWithTemplateMemberFunctionF {
  return requires(HKT<T> h) { // HKT<T> is a type, h is an object
    // HKT<T> needs to have a member function template that 
    // returns HTK<U> where the type U is to be deduced and
    // it can be any type (it is unconstrained)
    template<class U>  // is there a syntax for this?
    h.F(std::declval<U>()) -> HKT<U>; 
  }
}
template <template <class> class HKT, class T, class U>
concept HKTWithTemplateMemberFunctionF {
  return requires(HKT<T> h) {
      h.F(std::declval<U>()) -> HKT<U>;
  }
}

共有1个答案

梁丘璞瑜
2023-03-14

长话短说,现在你(我?)必须提供特定的U:

template <template <class> class HKT, class T, class U = T>
concept HKTWithTemplateMemberFunctionF {
  return requires(HKT<T> h) { // HKT<T> is a type, h is an object
    h.F(std::declval<U>()) -> HKT<U>; 
  }
}

由于编译器无法为可能存在的所有类型u证明成员函数模板可以工作,也就是说,以下情况是无望的:

template <template <class> class HKT, class T>
concept HKTWithTemplateMemberFunctionF {
  return requires(HKT<T> h) {
    template<class U>  // for all those Us that haven't been written yet...
    h.F(std::declval<U>()) -> HKT<U>; 
  }
}

在一个假设的5分钟内指定概念的Lite实现中,我们能够对U进行一点点约束:

template <template <class> class HKT, class T, 
          InputIterator U = InputIterator()  /* imaginary syntax */ >
concept HKTWithTemplateMemberFunctionF {
  return requires(HKT<T> h) {
      h.F(std::declval<U>()) -> HKT<U>; // Is InputIterator enough to instantiate F?
  }
}
 类似资料:
  • 有了C++20和概念,我想知道是否可以写一个概念来检查一个类型是否有一个带有特定名称的函数,该函数接受任意数量的任意参数。 以下面的代码为例(使用GCC当前的概念TS语法):

  • 这个问题演示了如何使用C++20概念为函数模板选择重载。我试图做一些类似的事情:为类模板选择专门化。 编译器将此附加实现视为使用不同约束对模板的重新声明。我尝试了几种不同的方式来表达我的意图,但没有一种能满足我所尝试的编译器。事实上,我甚至无法用和传统的SFINAE实现这一点--诚然,我完全有可能不太理解SFINAE。 我发现的唯一方法需要对每种整型和浮点型进行不同的专门化。 [是的,我知道还有几

  • 我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译

  • 和Sfinae有麻烦。我需要能够确定一个类型是否定义了成员函数运算符->,而不管它的返回类型如何。示例如下。 HasOperatorMemberAccessor无法找到PointX的成员函数“Object Operator->()Const”。因此它使用Test的通用版本测试(...)。 但是,HasOperatorMemberAccessorOBJECT能够找到PointX的“Object Op

  • 关系模型可以表示为包含列和行的表,每一行都称为元组。 列的每个表都有一个名称或属性。 域 - 包含属性可以采用的一组原子值。 属性 - 包含特定表中列的名称。每个属性必须有一个域。 关系实例 - 在关系数据库系统中,关系实例由一组有限的元组表示。关系实例没有重复的元组。 关系模式 - 关系模式包含所有列或属性的关系名称和名称。 关系键 - 在关系键中,每行都有一个或多个属性。它可以唯一地标识关系中

  • 主要内容:1. 实体,2. 属性,3.关系ER模型代表实体-关系模型。 它是一种高级数据模型。 此模型用于定义指定系统的数据元素和关系。它为数据库开发了概念设计。它还开发了一种非常简单易用的数据视图。 在ER建模中,数据库结构被描绘为称为实体关系图。 例如,假设要设计一个学校数据库。 在该数据库中,学生(student)将是具有地址,姓名,身份,年龄等属性的实体。地址(address)可以是具有诸如城市,街道名称,密码等属性的另一实体,并