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

约束模板参数

吴驰
2023-03-14

假设我有一个类模板,Angle

SFINAE方法:

template <typename T,
          std::enable_if_t<std::is_floating_point_v<T>, bool> = true>
struct Angle { T m_radians; };

C20给了我们一些概念:

template <std::floating_point T>
struct Angle { T m_radians; };

或者,我可以用static_assert约束类型:

template <typename T>
struct Angle {
    static_assert(std::is_floating_point_v<T>,
                  "Angle<T> works only with floating point types.");
    T m_radians;
};

问题:我是否可以对带有概念/要求的的模板参数设置约束,而这些约束是我无法使用的

[我不是在征求关于哪种技术更好的意见。而且,我知道像enable\u if这样的概念可以利用SFINAE在解析过程中消除重载和专门化,而这是使用static\u assert无法做到的。我的问题完全是关于约束的。]


共有1个答案

朱雅惠
2023-03-14

它们都能够对传入的类型进行图灵完全计算并接受任意子集,并且可以访问关于每个类型的相同信息。

没有一个更强大或更弱。

 类似资料:
  • 我有一系列复杂的类型级别函数,它们的计算结果如下: 显然,在这种情况下,这个表达式是一个。更一般地说,我们可以说: 有没有办法教GHC推断这一点? 编辑:@chi指出,在某些情况下,GADT可以解决这一问题,但我的特殊情况是: 然后 不能被访问,但是也许GHC应该能够推断出

  • 我正在尝试创建自己的复合验证注释来验证字符串——到目前为止,它由注释@NotNull、@NotBlank和@Size组成 但是,我不想让它们保持默认值,而是希望能够传入一个参数值,例如,如果我执行@ValidString(min=1,max=50),那么@Size注释可以读取这些值——这可能吗? 我的约束-

  • 本文向大家介绍TypeScript 类型参数作为约束,包括了TypeScript 类型参数作为约束的使用技巧和注意事项,需要的朋友参考一下 示例 使用TypeScript 1.8,类型参数约束可以从同一类型参数列表中引用类型参数。以前这是一个错误。            

  • 现在还有另一种可能的使用方法,我不太明白 这个函数可以很容易地接受任何可转换为a的类型。这很奇怪,因为第一个模板参数(“from”)基本上被删除,并在函数调用时推导出来。下面的函数也可以工作,我很肯定它实际上与前面的函数等效 同样,的类型是在调用时推导出来的。

  • 这在gcc中编译,但在clang和最新的MSVC预览编译器中都不编译 下一个尝试是使用friend声明中的约束,即。 这看起来像是一种自然的方式,因为无论如何只能在满足约束的情况下实例化friend。