diff --git a/README.md b/README.md index 8e8b097..9b56644 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,6 @@ ## 关于内卷 -如果你把 variant 的 operator<< 改成了基于变长模板参数的,或是实现了其他运算符: +如果你把 variant 的 `operator<<` 改成了基于变长模板参数的,或是实现了其他运算符: 只要是在 **满足作业要求的基础** 上,这是件好事! 老师会酌情加分,视为“独特的创新点”,但最多不超过 20 分。 diff --git a/main.cpp b/main.cpp index d76cce7..72c3aff 100644 --- a/main.cpp +++ b/main.cpp @@ -3,6 +3,7 @@ #include // 请修复这个函数的定义:10 分 +template std::ostream &operator<<(std::ostream &os, std::vector const &a) { os << "{"; for (size_t i = 0; i < a.size(); i++) { @@ -16,19 +17,34 @@ std::ostream &operator<<(std::ostream &os, std::vector const &a) { // 请修复这个函数的定义:10 分 template -std::vector operator+(std::vector const &a, std::vector const &b) { +auto operator+(std::vector const &a, std::vector const &b) { // 请实现列表的逐元素加法!10 分 // 例如 {1, 2} + {3, 4} = {4, 6} + std::vector c(std::min(a.size(), b.size())); + for (int i = 0; i < c.size(); i++) c[i] = a[i] + b[i]; + return c; } -template -std::variant operator+(std::variant const &a, std::variant const &b) { +template +auto operator+(std::variant const &a, T const &b) { // 请实现自动匹配容器中具体类型的加法!10 分 + return std::visit([&](auto const &x) { + return x + b; }, a); } -template -std::ostream &operator<<(std::ostream &os, std::variant const &a) { +template +auto operator+(T const &a, std::variant const &b) { + return std::visit([&](auto const &x) { + return a + x; }, b); +} + +template +std::ostream &operator<<(std::ostream &os, std::variant const &a) { // 请实现自动匹配容器中具体类型的打印!10 分 + return std::visit([&](auto const &x) -> std::ostream & { + os << x; + return os; + }, a); } int main() { @@ -44,7 +60,7 @@ int main() { // 应该输出 {4.14, 6.718, 2.618} std::cout << c << std::endl; - std::variant, std::vector> d = c; + std::variant, std::vector, std::vector> d = c; std::variant, std::vector> e = a; d = d + c + e;