C++ 预期的替代实施<;T>;

C++ 预期的替代实施<;T>;,c++,C++,最近我看了安德烈·亚历山德雷斯库的一个节目。拟议预期模板的结构如下: template<class T> class Expected { union { T ham; std::exception_ptr spam; }; bool gotHam; }; 在这种情况下,只要发生错误,垃圾邮件就可以用作指示器 您可以在ham上使用指针,这样就不会调用默认构造函数,也不需要在您的版本中没有意义的联合 此外,我认为您的版本不会改变

最近我看了安德烈·亚历山德雷斯库的一个节目。拟议预期模板的结构如下:

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

在这种情况下,只要发生错误,
垃圾邮件
就可以用作指示器

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


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

我的注释重写为一个答案:

您的版本存在一些问题:

  • 而不是
    sizeof(预期)==max(sizeof(T),sizeof(std::exception\u ptr))+sizeof(bool)
    你有
    sizeof(预期)==sizeof(T)+sizeof(std::exception\u ptr)
    。由于std::exception_ptr更像是一个智能指针,而不是一个普通指针,因此它可能要大得多
  • std::exception_ptr不能保证是constexpr,您必须始终构造它。这意味着Expected不能是constexpr,也不能是可移植的

尽管有种种缺点,您仍然必须打开异常指针,它的复杂性不亚于bool。

您版本中的
联合
毫无意义……我认为
联合
将阻止执行
T
的默认构造函数。您仍然需要进行分支,但现在需要测试垃圾邮件是否为空指针。没有区别。std::exception_ptr不仅仅是一个指针,因为它使异常保持活动状态(更像是一个共享的_ptr),所以您期望的是T+某种类型的智能指针的大小,而不是max(T,std::shared_ptr)+bool。此外,std::exception_ptr不能保证为constexpr,这意味着您的预期值不能可靠地为constexpr。
template<class T> class Expected {
    union { T ham; };
    std::exception_ptr spam;
};