【问题标题】:Alternative implementation of Expected<T>Expected<T> 的替代实现
【发布时间】:2013-10-27 04:52:09
【问题描述】:

最近我看了一个由 Andrei Alexandrescu 提供的presentation about "Systematic Error Handling in C++"。提议的 Expected 模板的结构如下:

template<class T> class Expected {
    union {
        T ham;
        std::exception_ptr spam;
    };
    bool gotHam;
};

使用联合使实现有点复杂,因为您需要通过gotHam 字段进行分支,然后然后决定如何处理联合中的数据。 IE。 hamspam 无法对初始化列表进行初始化。

我想知道简化版本是否会更好。

template<class T> class Expected {
    union { T ham; };
    std::exception_ptr spam;
};

在这种情况下,spam 可以用作发生错误时的指示符。

【问题讨论】:

  • 你版本中的union 没有意义……
  • 我认为union 会阻止T 的默认构造函数的执行。
  • 您仍然需要分支,但现在您需要测试 spam 是否为空指针。没有区别。
  • std::exception_ptr 不仅仅是一个指针,因为它使异常保持活动状态(更像一个 shared_ptr),所以您的预期是 T 的大小 + 某种类型的智能指针而不是 max(T, std::shared_ptr) + 布尔值。此外,std::exception_ptr 不能保证是 constexpr,这意味着您的 Expected 不能可靠地成为 constexpr。

标签: c++


【解决方案1】:

您可以在 ham 上使用指针,这样就不会调用默认构造函数,并且您不需要在您的版本中没有真正意义的 union。

另外,我不认为你的版本改变了分支的需要,因为你仍然需要测试异常指针而不是布尔值。

【讨论】:

    【解决方案2】:

    我的评论被重写为答案:

    您的版本存在一些问题:

    • 你有sizeof(Expected) == sizeof(T) + sizeof(std::exception_ptr),而不是sizeof(Expected) == max(sizeof(T), sizeof(std::exception_ptr)) + sizeof(bool)。由于 std::exception_ptr 更像是智能指针而不是普通指针,因此它可能会大得多。
    • std::exception_ptr 不保证为 constexpr,您始终必须构造它。这意味着 Expected 不能是 constexpr 并且仍然是可移植的。

    对于所有缺点,您仍然需要打开异常指针,它不亚于布尔值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-04
      • 2017-10-31
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      相关资源
      最近更新 更多