【发布时间】: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。 ham 和 spam 无法对初始化列表进行初始化。
我想知道简化版本是否会更好。
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++