gpt4 book ai didi

c++ - 将具有条件要求的概念形式化

转载 作者:行者123 更新时间:2023-12-03 06:53:52 24 4
gpt4 key购买 nike

C++20 中的概念的一个好处是,此功能允许并鼓励程序员指定(使用 C++ 语言本身)有关其界面的信息,这些信息以前必须以英语等自然语言出现在仅人工文档中。
例如,我有一个通用算法,我们称之为 template<int N, template<int> class X> void foo(X<N>) .我的 foo()解决了数值域中的某个问题。我关于如何使用的纯英文文档 foo()像这样说:“foo() 接受类 X<N> 的参数,foo 的用户必须实现它。类 X<N> 有一个整数模板参数 N,描述它有多少行。类 X<N> 提供运算符[] 访问一行的元素。X<N> 还提供了一个成员函数 reduce(),除非 N=1,在这种情况下,减少没有意义,因为只有一行。”
我将如何概念化这个?我的第一种方法是:

template<class T>
concept Fooable = requires(T x, int i) {
x[i];
}
但这并没有正式化 reduce() 要求。
如果我只有一个(正式的)概念,那么我不能在 requires 表达式中包含 x.reduce() ,因为一些 Fooable 类,即那些 N=1 的类,没有也不能实现 reduce() 方法。
我希望我的 requires 表达式包含类似 if constepxr(T::N > 1) x.reduce(); 的内容但是 if是一个控制流语句而不是一个表达式,所以不能在 requires 表达式中。
问题:我如何使用 C++20 概念来正式化这个契约(Contract)?

最佳答案

嗯,这出奇的容易。

#include <concepts>
#include <cstddef>
#include <type_traits>

template<int N, template<int> class X>
concept Fooable =
requires(X<N> a, int i) { a[i]; } &&
(
N == 1 ||
requires(X<N> a) { a.reduce(); }
);

template<int N, template<int> class X>
requires Fooable<N, X>
void foo(X<N>) {}

template<int N>
struct Myx1 {
int operator[](int) { return 0; };
};

template<int N>
struct Myx2 {
int operator[](int) { return 0; }
int reduce() { return 0; }
};

int main() {
foo(Myx1<1>{});
foo(Myx1<2>{}); // error - no reduce() and N != 1
foo(Myx2<2>{});
}
||概念中的运算符是短路的,就像普通运算符一样,所以 N == 1 || something按预期工作。

关于c++ - 将具有条件要求的概念形式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64719818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com