From fe11c49985014bada0e35ae3743b4405814eec04 Mon Sep 17 00:00:00 2001 From: nwpuCfy Date: Sun, 11 Sep 2022 23:58:24 +0800 Subject: [PATCH] finish hw03 --- main.cpp | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/main.cpp b/main.cpp index d76cce7..d762d9c 100644 --- a/main.cpp +++ b/main.cpp @@ -1,8 +1,10 @@ #include #include #include +#include "cpp_type_name.h" -// 请修复这个函数的定义:10 分 +// 请修复这个函数的定义:10 分 (添加模板声明) +template std::ostream &operator<<(std::ostream &os, std::vector const &a) { os << "{"; for (size_t i = 0; i < a.size(); i++) { @@ -14,21 +16,38 @@ std::ostream &operator<<(std::ostream &os, std::vector const &a) { return os; } -// 请修复这个函数的定义:10 分 +// 请修复这个函数的定义:10 分 (不应使用T0, 用auto代替) 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} + size_t len = std::min(a.size(), b.size()); + std::vector res(len); + for (size_t i = 0; i < len; ++i) { + res[i] += a[i] + b[i]; + } + return res; +} + +template +std::variant operator+(std::variant const &a, T2 const &b) { + return a + std::variant(b); } template std::variant operator+(std::variant const &a, std::variant const &b) { // 请实现自动匹配容器中具体类型的加法!10 分 + return std::visit([](auto&& arg1, auto&& arg2) -> std::variant { + return arg1 + arg2; + }, a, b); } template std::ostream &operator<<(std::ostream &os, std::variant const &a) { // 请实现自动匹配容器中具体类型的打印!10 分 + return std::visit([&](auto&& arg) -> std::ostream& { + return os << arg; + }, a); } int main() { @@ -36,6 +55,7 @@ int main() { std::cout << a << std::endl; std::vector b = {3.14, 2.718, 0.618}; std::cout << b << std::endl; + auto c = a + b; // 应该输出 1 @@ -50,6 +70,6 @@ int main() { // 应该输出 {9.28, 17.436, 7.236} std::cout << d << std::endl; - + return 0; }