我有一个简单的结构,可以携带结果或错误,从不两者。
两者都是相同的类型,但为了清楚起见,我想要两个成员。
从阅读cppreference.com看起来下面的代码片段是有效的c ++?
在union析构函数中使用placement delete来整理non trivial
类(在此实例中为std :: string)。
struct Result {
union {
std::string resultText;
std::string errorText;
~(){ resultText.~string();}
};
};
看起来,要使用它,包含结构需要实现5规则成员来显式复制/移动resultText。
答案 0 :(得分:1)
联盟只会降低代码的可读性。根据您的使用方式,它也会增加维护。实际上你提到了实施5"的规则。尽管有std::string
成员表示你的班级将成为维持的噩梦。
我会看一下这些选项(在问题中没有足够的细节来确定什么是最好的):
使用例外。您可以通过从std::exception
使用Boost.Optional
。
boost::optional<std::string> do_something() { ... };
std::string result = do_something().value_or("error!");