试作 Boost.Assign
题目描述
下面代码中的 IntVector
模拟了一个可变长度数组(类似 std::vector
)。通过补全适当的代码,使得可以通过 v += x, y, z;
的方式向数组 v
中添加元素。
关于输入
一行,为空格分隔的两个整数 a b
关于输出
第一行为 1 2 3
第二行为 1 2 3 a 5 6 7 b,其中 a 和 b 是输入的整数
核心技巧
将 operator+=
的返回值类型定义为全新的、专有的类类型。当且仅当左侧操作数为该类型时,才应用对应的 operator,
重载。
参考答案
#include <iostream>
class IntVector {
static constexpr int capacity{256};
int len{0};
int data[IntVector::capacity];
public:
IntVector() = default;
IntVector(const IntVector&) = default;
void pushBack(int e) {
data[len++] = e;
}
int at(int i) {
return data[i];
}
int size() {
return len;
}
};
struct Adder {
IntVector& src;
};
Adder operator+=(IntVector& v, int e) {
v.pushBack(e);
return Adder{v};
}
Adder operator,(Adder v, int e) {
v.src.pushBack(e);
return v;
}
int main() {
IntVector v;
v += 1, 2, 3;
for (int i = 0; i < v.size(); i++) {
std::cout << v.at(i) << " ";
}
std::cout << std::endl;
int x, y;
std::cin >> x >> y;
v += x, 5, 6, 7, y;
for (int i = 0; i < v.size(); i++) {
std::cout << v.at(i) << " ";
}
std::cout << std::endl;
// 先将 v 清空,然后检查 v.size() 是否为 0
if (v = {}, v.size()) {
std::cout << "Unreachable" << std::endl;
}
}