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

C++20:多类型概念及其约束,正确的语法?

鲜于德业
2023-03-14

根据最近科隆ISO C++会议上的reddit报告,在即将发布的C++20标准中,我们将能够指定模板的概念,并且对于每个类/函数模板,我们将能够设置对其类型的约束。然而,在文档和教程中(例如这里),我找不到多类型用例的正确语法。

template<typename T1, typename T2>
concept AreEqComparable = requires(T1 a, T2 b) {
    { a == b } -> bool;
};
???
bool are_equal(T1 a, T2 b) { return a == b; }
/* 1 */ template<AreEqComparable T1, T2>
/* 2 */ AreEqComparable<T1, T2>
/* 3 */ template<AreEqComparable<T1, T2>>

但它们都抛出语法错误。我认为答案应该在Bjarne Stroustrup的规范P0557中的某个地方,但我很快就找不到了。

共有1个答案

百里金林
2023-03-14

可以这样写:

template <typename T1, typename T2>
    requires AreEqComparable<T1, T2>
bool are_equal(T1 a, T2 b)
{
    // ...
}

在这里,我们使用一个requires子句对类型模板参数施加一个要求。

 类似资料:
  • 对于概念,提供了很好的语法,如

  • 编译器如何准确地使用规则来估计函数的约束程度?当混合不受约束和受约束的过载时,这些规则如何与常规过载解决方案相互作用?

  • 在cppreference上,有一个示例定义了概念。我复制了下面的示例: 这个概念对许多用途都有意义。在这些情况下,类型的对象上的哈希函数是专门化。但是,出于我的目的,我不想假设哈希将是。我希望用户能够提供一个不同的哈希函数。 由于和绑定得如此紧密,所以我不认为可以为和定义单独的概念。那是正确的吗?因此,我想定义一个概念,它同时处理和。 null

  • 泛型的类型约束 swapTwoValues(_:_:)函数和Stack类型可以用于任意类型. 但是, 有时在用于泛型函数的类型和泛型类型上, 强制其遵循特定的类型约束很有用. 类型约束指出一个类型形式参数必须继承自特定类, 或者遵循一个特定的协议、组合协议. 例如, Swift的Dictionary类型在可以用于字典中键的类型上设置了一个限制. 如字典中描述的一样,字典键的类型必须是可哈希的. 也

  • 在Java中,我们可以在类的里面再定义类。如果它是一个通常的类,它不能去访问外部类的成员(就如Java中的static): class Outer { private val bar: Int = 1 class Nested { fun foo() = 2 } } val demo = Outer.Nested().foo() // == 2 如果需要去访问外

  • 本文向大家介绍浅谈java泛型的作用及其基本概念,包括了浅谈java泛型的作用及其基本概念的使用技巧和注意事项,需要的朋友参考一下 一、泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化。java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中的ArrayList<Integer>和ArrayList<Stri