From 2015586e84a7eb7240ec530171b694438e6bf3b0 Mon Sep 17 00:00:00 2001 From: Sduby Date: Fri, 11 Feb 2022 18:52:32 +0800 Subject: [PATCH] hw03 --- main.cpp | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/main.cpp b/main.cpp index d76cce7..b070aca 100644 --- a/main.cpp +++ b/main.cpp @@ -1,8 +1,12 @@ #include +#include +#include #include #include // 请修复这个函数的定义:10 分 +// A: 没有加模板声明 +template std::ostream &operator<<(std::ostream &os, std::vector const &a) { os << "{"; for (size_t i = 0; i < a.size(); i++) { @@ -15,20 +19,38 @@ std::ostream &operator<<(std::ostream &os, std::vector const &a) { } // 请修复这个函数的定义:10 分 +// 使用type_traits中的common_type +// 为了让返回值长度短点,能否修改下一行为 +// template ::type > template -std::vector operator+(std::vector const &a, std::vector const &b) { +std::vector::type> operator+(std::vector const &a, std::vector const &b) { // 请实现列表的逐元素加法!10 分 // 例如 {1, 2} + {3, 4} = {4, 6} + using elemtype = typename std::common_type::type; + auto len = std::min(a.size(), b.size()); + std::vector vec(len); + for (size_t i = 0; i != len; i++) { + vec[i] = a[i] + b[i]; + } + return vec; } template std::variant operator+(std::variant const &a, std::variant const &b) { // 请实现自动匹配容器中具体类型的加法!10 分 + return std::visit([](const auto &x, const auto &y) -> std::variant { + return x + y; + }, a, b); } -template -std::ostream &operator<<(std::ostream &os, std::variant const &a) { +// 踩坑:如果只有一个变长模板参数,则会默认实例化出来一个变长参数为空的实例出来 +// 所以需要是 1 + * 的方式定义模板参数,不能只有一个 * +template +std::ostream &operator<<(std::ostream &os, std::variant const &a) { // 请实现自动匹配容器中具体类型的打印!10 分 + return std::visit([&](const auto &x) -> std::ostream& { + return os << x; + }, a); } int main() { @@ -46,7 +68,10 @@ int main() { std::variant, std::vector> d = c; std::variant, std::vector> e = a; - d = d + c + e; + + // 这里vector不能隐式转换为variant, 可能是因为T1, T2模板参数推断不出来? + // 不知道如何解决,只能强制转换了。 + d = d + static_cast, std::vector>>(c) + e; // 应该输出 {9.28, 17.436, 7.236} std::cout << d << std::endl;