C++一个函数能否返回两种不同类型?如何实现返回vector首元素或空提示
编程题first()函数实现方案
你的实现思路问题在于统一将返回值转为std::string,既丢失了vector存储的原始元素类型,也无法适配自定义元素类型的场景,这也是老师指出不需要用to_string的原因。
正确的实现思路是返回一个可同时承载「是否有值」状态和原始元素类型的包装类型,再通过重载std::ostream的<<运算符实现两种状态的差异化输出,完全不需要提前转字符串。
方案1:基于C++17 std::optional实现(最简标准库方案)
std::optional是C++17引入的专门用于表示「可选值」的标准库类型,完美匹配需求:
完整代码
#include <iostream> #include <vector> #include <optional> // 重载<<运算符,处理optional的输出逻辑 template <typename T> std::ostream& operator<<(std::ostream& os, const std::optional<T>& opt) { if (!opt.has_value()) { os << "No value!"; } else { os << opt.value(); } return os; } // first函数实现 template <typename T> std::optional<T> first(const std::vector<T>& ve) { if (ve.empty()) { return std::nullopt; // 表示无值的空状态 } return ve.front(); // 非空返回首个元素 } // 测试代码和你给出的完全一致,无需修改 int main() { std::vector<double> v; auto z = first(v); std::cout << z << std::endl; // OUTPUT: No value! v.push_back(3.14); z = first(v); std::cout << z << std::endl; // OUTPUT: 3.14 return 0; }
该方案中auto z推导的类型为std::optional<double>,完全保留了原始元素类型,不需要任何字符串转换操作。
方案2:自定义可选类型实现(兼容C++11及更早标准)
如果考试不允许使用C++17特性,可以自己实现一个轻量的可选包装类,逻辑和上述方案完全一致:
完整代码
#include <iostream> #include <vector> // 自定义可选类型 template <typename T> class Optional { private: bool m_hasValue; T m_value; public: // 空状态构造函数 Optional() : m_hasValue(false) {} // 有值状态构造函数 Optional(const T& val) : m_hasValue(true), m_value(val) {} bool hasValue() const { return m_hasValue; } const T& getValue() const { return m_value; } }; // 重载<<运算符 template <typename T> std::ostream& operator<<(std::ostream& os, const Optional<T>& opt) { if (!opt.hasValue()) { os << "No value!"; } else { os << opt.getValue(); } return os; } // first函数实现 template <typename T> Optional<T> first(const std::vector<T>& ve) { if (ve.empty()) { return Optional<T>(); } return Optional<T>(ve.front()); } // 测试代码完全不变 int main() { std::vector<double> v; auto z = first(v); std::cout << z << std::endl; // OUTPUT: No value! v.push_back(3.14); z = first(v); std::cout << z << std::endl; // OUTPUT: 3.14 return 0; }
内容的提问来源于stack exchange,提问作者mirza.o258
相关产品推荐
相关产品推荐

