我有一个简单的结构,它可以携带结果或错误,但不能同时携带两者。
两者都是同一类型,但为了清楚起见,我想要两个成员。
来自阅读cppreference.com看起来下面的代码片段是有效的 C++?
在 union 析构函数中使用放置删除来整理 非平凡的
类(在本例中为 std::string)。
struct Result {
union {
std::string resultText;
std::string errorText;
~(){ resultText.~string();}
};
};
看起来,要使用它,包含的结构需要实现 5 规则成员才能显式复制/移动 resultText。
最佳答案
union 只会降低代码的可读性。并且根据您的使用方式,它也会增加维护量。实际上,尽管有一个 std::string
成员,但您提到“实现 5 规则”这一事实表明,您的类将成为维护的噩梦。
我会查看这些选项(问题中没有足够的细节来确定什么是最好的):
使用异常。您可以通过派生自
std::exception
来创建自定义异常
使用
Boost.Optional
。boost::optional<std::string> do_something() { ... }; std::string result = do_something().value_or("error!");
关于c++ - C++ 中的 union 与单个非平凡类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37167417/