【发布时间】:2020-12-28 17:14:07
【问题描述】:
抱歉标题含糊不清,我找不到合适的词来表达它。
我试图强制一个类定义一些正确的函数/运算符。例如ForwardIterator 需要有一些运算符,否则我应该得到一个编译器错误。我已经问过here 的问题,我得到了一个带有继承的方法,它工作得很好,但是 C++20 的概念似乎更直观并且给出了更好的错误。
最初的想法是:
template <typename T> concept is_ForwardIterator= requires(T x, T y)
{
x == y;
};
template <typename T>
requires is_ForwardIterator<T>
struct ForwardIterator {
};
然后,每当我想实现一个前向迭代器时,我都会从ForwardIterator 继承:
struct MyCustomIterator
: public ForwardIterator <MyCustomIterator>
{
bool operator ==(const MyCustomIterator& other) const;
};
但是编译器一直抱怨MyCustomIterator不满足要求:
error: constraints not satisfied for class template 'ForwardIterator' [with T = MyCustomIterator]
note: because 'MyCustomIterator' does not satisfy 'is_ForwardIterator'
template <typename T> requires is_ForwardIterator<T> struct ForwardIterator {
^
note: because 'x == y' would be invalid: invalid operands to binary expression ('MyCustomIterator' and 'MyCustomIterator')
x == y;
【问题讨论】:
-
ForwardIterator的目的是什么?只是一种标记和检查自定义类型以满足约束的方法?如果是这样,如果类型必须选择加入此检查,为什么不能在完整的类定义之后对类型进行静态断言?class MyCustomIterator{}; static_assert(is_ForwardIterator<MyCustomIterator>); -
您知道
==重载的参数应该是const引用参数,而不是可变引用参数吗? -
在类的定义中添加约束有点奇怪。通常你会想在使用类时检查约束。
标签: c++ oop c++20 c++-concepts