You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何抛出异常不被视为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:57:11