预期<t> </t>的替代实施

时间:2013-10-18 11:01:32

标签: c++

最近我看了Andrei Alexandrescu给出的presentation about "Systematic Error Handling in C++"。拟议的预期模板的结构如下:

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

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

我想知道简化版是否会让它变得更好。

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

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

2 个答案:

答案 0 :(得分:1)

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

此外,我认为您的版本不会更改分支的需要,因为您仍然需要测试异常指针而不是布尔值。

答案 1 :(得分:1)

我的评论改写为答案:

您的版本存在一些问题:

  • 而不是sizeof(Expected) == max(sizeof(T), sizeof(std::exception_ptr)) + sizeof(bool)您拥有sizeof(Expected) == sizeof(T) + sizeof(std::exception_ptr)。由于std :: exception_ptr更像是智能指针而不是普通指针,因此它可能会大得多。
  • std :: exception_ptr不保证是constexpr,你总是需要构造它。这意味着预期不能是constexpr,仍然可以携带。

对于所有的缺点,你仍然需要打开异常指针,这个指针不比bool复杂。