最近我看了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
字段进行分支,然后决定如何处理联合中的数据。即无法对ham
和spam
初始化初始化列表进行初始化。
我想知道简化版是否会让它变得更好。
template<class T> class Expected {
union { T ham; };
std::exception_ptr spam;
};
在这种情况下,spam
可以在发生错误时用作指示符。
答案 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更像是智能指针而不是普通指针,因此它可能会大得多。对于所有的缺点,你仍然需要打开异常指针,这个指针不比bool复杂。