在不使用指针的情况下,在C ++中返回“无效值”类型的正确方法是什么?

时间:2016-06-29 14:24:58

标签: c++ pointers return-value

从函数返回时,我经常使用-1作为无效值类型,其中输入产生错误的输出。例如,编写索引超出范围的索引函数,而不是抛出异常,可以返回-1。但是当编写具有负值的函数作为可能的返回类型时,此技术不起作用。在这种情况下返回无效类型值的正确方法是什么?

我主要使用的技术是将返回类型设置为*int类型,并将指针返回NULL。但是,这要求所有返回值都是指针类型,这似乎是函数的额外开销。在这种情况下,是否有可接受的返回值标准?

3 个答案:

答案 0 :(得分:30)

在较新的C ++中,我建议使用{% filter replace({'foo': '&hellip;'})|raw %} {{ form_widget(searchForm.query, { 'type': 'search', 'attr': { 'placeholder': 'Search queryfoo' } } ) }} {% endfilter %} ;如果你还没有,std::optional<>

答案 1 :(得分:0)

一个选项是让你的函数将bool&作为输出参数,用于指示返回的值是否有效。

int myFunc(bool& valid); // sets 'valid' to true if result is usable, false otherwise

然后用户可以

bool valid = false;
Int result = myFunc(valid);
if (!valid) {
    // Handle error
}
// Use result

不是最漂亮的解决方案,但它可以胜任。

答案 2 :(得分:0)

除了我上面提供的答案之外,还有一个非常干净,持续传递的解决方案(鉴于你是非虚拟的):

template<typename Success, typename Failed>
void parse( const std::string& str, Success s, Failed f )
{
    auto a = start_parse(str);
    if( a.problem() )
        return f(); // you _might_ have an error code here

    s( finish_parse(str, a) );        
}

然后您可以通过以下方式进行自定义:

  • 成功:
    • [&i] (int i_) { i = i_; }
    • out(i),其中out(int& output_)返回output_的上述lambda
    • 实际代码做有用的事情
    • 继续
    • 的功能
  • 失败:
    • [&i]{ i = 0; },`[&amp; i] {i = nullopt; },或任何其他默认值
    • [] { throw MyFavouriteException(); }
    • 重试逻辑
    • std::terminate()
    • []{}如果您不在乎(或者如果您100%确定它会成功)

可能看起来有点冗长,但恕我直言:

  • 阅读
  • 是微不足道的
  • 可以模仿任何其他原理图,即使没有默认的c'tor
    • 也很容易改变
  • '你没有为你不使用的东西买单',肯定可以优化掉
  • 从代码中可以看到每个原理图:
    • 作为默认值,调用者设置它,而不是callee或global
    • std::optional<>和默认值处理相同
    • 例外,来电者更了解扔什么
    • 不执行任何操作,您无需查找实现以了解此
    • 代表std::terminate(),嗯,你知道会发生什么
    • 如果您说'CPS,您实际上可以继续并保存if / catch /等。

我看到的唯一问题是构造函数初始化列表。有什么想法吗?