试作 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;
    }
}