有没有办法可以创建一个应该返回值的函数?

时间:2014-06-11 06:57:53

标签: c++ function

我已经提出了一个代码块,它在我的程序中执行必要的功能,但也搞砸了许多其他功能。如果在使用find_if找不到匹配的术语时没有返回空项,则问题将得到解决,而是只打印一条消息并继续执行程序。但是,string_to_item必须返回一个项,因为它在一个需要项的函数中被调用为参数,并且任何删除return items("null")的尝试都会导致运行时错误。我的问题是,如果向量没有匹配string item_name的元素,或者我是否需要重写所涉及的函数,是否有任何方法可以让此函数不返回项目?代码是:

items string_to_item( string item_name, vector<items>& item_container ) {
    struct comparer {
        comparer( string const& item_name) 
            : item_name(item_name) {}
        bool operator()(items const& it) const { return it.name == item_name; }
        string const& item_name;
    }

    comp(item_name);

    vector<items>::iterator result = find_if(item_container.begin(), item_container.end(), comp);
    int i = distance( item_container.begin(), result);
    if ( result == item_container.end() ) {
        if( item_container.size() == 0 ) {
            cout << "no elements in vector  ( get_item )";
        }
        else {
            cout << "You don't see that here";
            return items("null");
        }
        }

    return item_container[i];
}

谢谢!

6 个答案:

答案 0 :(得分:2)

惯用法是返回迭代器本身,然后与调用站点中的item_container.end()进行比较。

您无法有条件地生成或不具有返回值。

答案 1 :(得分:2)

我能想到的唯一解决方案是将函数指针(或函子)传递给string_to_item,它引用了在没有找到匹配项的情况下要执行的代码,与CPS一样。

然而,你真的不希望&#34;不返回价值&#34;这里。我认为更好的解决方法是调整你的函数的调用者。

对于它的价值,在这样一个低级函数中间向cout打印一条消息似乎也是值得怀疑的。

答案 2 :(得分:1)

如果您不更改签名,则可能throw例外。

否则,如果您可以更改返回值:

答案 3 :(得分:1)

您可以使用多种方法(这并不是说您应该使用它们):

  1. 返回指针,当没有任何内容可以返回时,返回0而不是有效指针。

    这是旧的C风格,它使得无缝使用,但代价是段错误的危险。但是,段错误很容易调试。无缝使用意味着,您可以使用指向隐式指针的隐式转换,编写代码如下:

     if(Foo* myFoo = getFoo()) {
         //do something with myFoo
     } else {
         //handle failure
     }
    
  2. 当没有任何东西可以返回时抛出异常。

    这更像是C ++风格,但不比旧C风格更安全。一个未捕获的异常通常不像segfault那样容易调试,因为不一定很容易看到异常的来源。

  3. 使用其他类型的哨兵值。

    同样,这并不能避免调用者忘记正确处理故障的事实。所以这或多或少是灾难收据。

  4. 使用两个返回值:一个带有值,另一个带有一个标志,指示返回值是否有效。你可以使用一个抛弃结构。或者使用boost::optional<>,这是一个美化的扔掉式结构。

    同样,这是一个灾难收据,因为调用代码不会被强制处理失败。

  5. 传递默认值以在没有任何内容返回时返回。

    这样做的好处是让调用者决定应该如何精确处理失败,但需要额外的参数。一般不值得努力。

  6. 所以底线是:你做的不仅仅是返回一个可能是0的指针。

答案 4 :(得分:0)

要选择性地返回元素,boost::optional<Item>是一个很好的解决方案。 “optional”也将成为C ++ 17的一部分。

答案 5 :(得分:0)

如果你不想在字符串item_name和vector&amp;之间没有匹配的情况下返回空值。找到item_container,你可以返回一个值为“null”的字符串,值为0或类似的东西,以后你可以从其他函数处理,并没有给你任何问题