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)
。由于std::exception_ptr更像是一个智能指针,而不是一个普通指针,因此它可能要大得多sizeof(预期)==sizeof(T)+sizeof(std::exception\u 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;
};