c++ 模版编程里面,经常有这样的场景, 我们需要对类型有个限度, 即他需要支持一些列操作才行,在c++20 前为了实现这些,我们很可能会写出一些非常晦涩难懂的代码, 但是c++20 concept 将这一切都变得非常容易
本文定义了个LoopAble, 只有符合其定义的约束是时候才能通过编译,
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
concept LoopAble = requires(T t) {
++t.begin();
*(t.begin());
t.end();
t.begin() != t.end();
};
template <LoopAble T>
void pt(const T& t) {
for (auto v : t) {
cout << v << "\t";
}
cout << endl;
}
template <typename T>
class Ite {
private:
T* val;
public:
Ite(T* val) : val(val) {}
T operator*() { return *val; }
Ite operator++() {
val++;
return *this;
}
bool operator!=(Ite other) { return val != other.val; }
};
template <typename T>
class MyVec {
private:
T* data;
int size;
public:
MyVec(vector<T> data) {
size = data.size();
this->data = new T[size];
for (int i = 0; i < size; i++) {
this->data[i] = data[i];
}
}
~MyVec() { delete[] data; }
Ite<T> begin() const { return Ite<T>(data); }
Ite<T> end() const { return Ite<T>(data + size); }
};
int main() {
vector<int> vec{1, 2, 3, 4};
pt(vec);
vector<int> vec2{1, 2, 3, 4, 5, 6, 7};
MyVec<int> myVec(vec2);
pt(myVec);
}
|