为何抛出异常不被视为C++运行时返回不同数据类型的技术?
关于用异常实现函数返回不同类型对象的疑问
我想到了一种实现函数返回不同类型对象的思路,代码如下:
// 该函数会在多处被调用,每处对返回对象的处理方式不同,处理逻辑也随返回对象类型而异。 void GetObject() { // 检查运行时条件 // Object1和Object2完全不同,无共同基类。 if (condition1) { // 执行Object1构造前的准备操作 throw Object1{ var1, var2, var3 }; } if (condition2) { // 执行Object2构造前的准备操作 throw Object2{ var4, var5 }; } throw MyException{}; } // 使用示例 int main() { try { GetObject(); } catch (const Object1& obj1) { // Object1专属处理逻辑 } catch (const Object2& obj2) { // Object2专属处理逻辑 } catch (const MyException& e) { // 错误处理逻辑 } }
但我发现一个奇怪的现象:在所有讨论“C函数返回不同数据类型”的问题解答里,完全没人提到这种用异常返回不同类型对象的技术。我能想到的唯一理由是这种写法不符合常规,但除此之外它看起来是最简单、最简洁的方案——不需要第三方库,不用升级到C17,也不需要额外的抽象层。
更新
很多人提到std::variant能很好解决这个问题,但它需要C++17或者Boost库,而我的项目目前无法使用其中任何一个。
更新2
感谢大家的反馈,这些意见帮我梳理了各种设计方案,也指出了我之前忽略的点。我最终选择了直接解释该技术未被广泛采纳原因的答案。另外两个答案提出了替代方案,有类似场景的朋友也可以参考。对我来说,最后决定采用输出参数方案,因为它简单且符合我无法使用C++17和Boost的限制:
bool GetObject( std::unique_ptr<Object1>& obj1, std::unique_ptr<Object2>& obj2) { // 检查运行时条件 if (condition1) { // 执行Object1构造前的准备操作 obj1 = std::make_unique<Object1>(var1, var2, var3); return true; } if (condition2) { // 执行Object2构造前的准备操作 obj2 = std::make_unique<Object2>(var4, var5); return true; } return false; } // 使用示例 int main() { std::unique_ptr<Object1> obj1; std::unique_ptr<Object2> obj2; if (!GetObject(obj1, obj2)) { // 错误处理逻辑 return -1; } if (obj1) { // Object1专属处理逻辑 } else { // Object2专属处理逻辑 } ... }
如果对象体积不大,也可以用栈上静态分配替代std::unique_ptr,但这要求Object1和Object2具备能告知调用者是否已初始化的成员函数。
内容的提问来源于stack exchange,提问作者wmjdgla
相关产品推荐
相关产品推荐

