NoS*_*tAl 22 c++ boost unique-ptr c++11 boost-optional
根据我的理解,有两种方法可以实现有时不返回结果的函数(例如,在ppl列表中找到的人).
* - 我们忽略原始ptr版本,与bool标志配对,以及未找到版本时的异常.
boost::optional<Person> findPersonInList();
Run Code Online (Sandbox Code Playgroud)
要么
std::unique_ptr<Person> findPersonInList();
Run Code Online (Sandbox Code Playgroud)
那么有什么理由可以优先于另一个吗?
Mat*_* M. 25
这取决于:您希望返回句柄还是副本.
如果您想要退回手柄:
Person*
boost::optional<Person&>
都是可以接受的选择.我倾向于使用一个Ptr<Person>
在无法访问的情况下抛出的类,但那是我的偏执狂.
如果您想要退回副本:
boost::optional<Person>
对于非多态类std::unique_ptr<Person>
对于多态类因为动态分配会产生开销,因此您只在必要时才使用它.
Kon*_*lph 14
一般的答案是你的意图是由boost::optional
而不是由你来表达std::unique_ptr
.也就是说,你的find
操作的特殊情况应该符合标准的库方式,假设你的底层类型有迭代器的概念:end()
如果没有找到元素则返回迭代器,否则返回元素的迭代器.
boost::optional
更清楚地说明你的意图.您需要明确记录该空std::unique_ptr
表示没有值返回
还有第四种方法:如果找不到任何内容,则使函数抛出异常.
我知道这并没有真正回答你的问题因此我道歉但也许你没想过.
啊,Xeo没出现呢?
好吧,我告诉过你一次,我会再说一遍:这两个是完全不同的用途,目的不同.
unique_ptr
意味着我拥有一个物体.这只是说"我是一个对象"的不同方式.因此,null unique_ptr
是可以引起注意的东西.我期待一个物体,但我一无所获; 代码一定是错的!optional
意味着我有时可能没有初始化,但没关系.在这种情况下,没有后顾之忧; 如果是的话None
,那就是被人们想到的行为.两者都隐含地转换为bool这一事实并不意味着它们可以相互兼容使用.使用optional
可能不会产生任何输出的代码(例如,读取流).用于unique_ptr
工厂对象; 他们很可能会为你创建一个对象,如果没有,就抛出异常.
关于你的例子的结论:find
应该返回optional
.
归档时间: |
|
查看次数: |
8067 次 |
最近记录: |