在某些条件下无法返回有意义值的c ++函数

dat*_*ole 3 c++ null pointers function

我有一个成员函数,对象类型作为返回值类型:

MyObject myfunction(parameters) {
    if (some condition) { 
        return MyObject(parameters);
    } else { 
        ... no valid object can be created ... 
    } 
}
Run Code Online (Sandbox Code Playgroud)

在某些条件下(在函数体中检查),无法创建和返回MyObject类型的对象.

Beeing只是偶尔的c ++程序员,我可以自发地提出三种解决方案:

  1. 如果不能创建有效对象,则将返回值类型更改为*MyObject并返回nullptr(C++ 11),然后在调用代码中检查与nullptr的相等性.
  2. 如果无法创建任何对象并在调用代码中捕获该对象,则抛出异常.
  3. 使用我定义为无效的某些值创建对象,并在使用返回的对象之前检查该对象.

处理这种情况的标准方法是什么,以及在性能方面的最佳解决方案?...或者一些明显的解决方法,我只是看不到......

最先进的C++ 11解决方案将是完美的:-)

到目前为止我的想法:
解决方案1似乎没问题,但只是C++ 11而且我必须在堆上创建返回的对象,以便能够将它传递给主程序(将对象本身返回给调用函数) ,因此将它保留在堆栈中对于小对象可能更快?).
解决方案2可能会更慢并导致主程序中的详细编码.
解决方案3可能是最慢的(对象是徒劳地创建的)并且在主程序中检查不是很方便.

对于我的代码,没有有效的返回对象是默认情况而不是异常,并且创建的对象相当小,但考虑到不同情况的一般考虑对于其他读者的应用程序肯定是有用的...

非常感谢大家的帮助:-)

Xeo*_*Xeo 7

在通常情况下,返回Boost.Optional工作:

boost::optional<MyObject> myfunction(parameters) {
    if (some condition) { 
        return MyObject(parameters);
    } else { 
        return boost::none;
    } 
}
Run Code Online (Sandbox Code Playgroud)

在通话现场:

auto ret = myfunction(...);
if(ret)
  // use '*ret'  or 'ret.get()'
Run Code Online (Sandbox Code Playgroud)

但正如R. Martinho所提到的,这个解决方案存在一些缺点(即,仅移动类型不起作用,因为Boost.Optional尚未更新以支持移动语义).