我已经提出了一个代码块,它在我的程序中执行必要的功能,但也搞砸了许多其他功能。如果在使用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];
}
谢谢!
答案 0 :(得分:2)
惯用法是返回迭代器本身,然后与调用站点中的item_container.end()
进行比较。
您无法有条件地生成或不具有返回值。
答案 1 :(得分:2)
我能想到的唯一解决方案是将函数指针(或函子)传递给string_to_item
,它引用了在没有找到匹配项的情况下要执行的代码,与CPS一样。
然而,你真的不希望&#34;不返回价值&#34;这里。我认为更好的解决方法是调整你的函数的调用者。
对于它的价值,在这样一个低级函数中间向cout
打印一条消息似乎也是值得怀疑的。
答案 2 :(得分:1)
如果您不更改签名,则可能throw
例外。
否则,如果您可以更改返回值:
您可以返回迭代器,(因此调用者可以自行进行检查)
或者如果是一个选项,您可以返回boost::optional<Item>
(见http://www.boost.org/doc/libs/1_55_0/libs/optional/doc/html/index.html)
答案 3 :(得分:1)
您可以使用多种方法(这并不是说您应该使用它们):
返回指针,当没有任何内容可以返回时,返回0
而不是有效指针。
这是旧的C风格,它使得无缝使用,但代价是段错误的危险。但是,段错误很容易调试。无缝使用意味着,您可以使用指向隐式指针的隐式转换,编写代码如下:
if(Foo* myFoo = getFoo()) {
//do something with myFoo
} else {
//handle failure
}
当没有任何东西可以返回时抛出异常。
这更像是C ++风格,但不比旧C风格更安全。一个未捕获的异常通常不像segfault那样容易调试,因为不一定很容易看到异常的来源。
使用其他类型的哨兵值。
同样,这并不能避免调用者忘记正确处理故障的事实。所以这或多或少是灾难收据。
使用两个返回值:一个带有值,另一个带有一个标志,指示返回值是否有效。你可以使用一个抛弃结构。或者使用boost::optional<>
,这是一个美化的扔掉式结构。
同样,这是一个灾难收据,因为调用代码不会被强制处理失败。
传递默认值以在没有任何内容返回时返回。
这样做的好处是让调用者决定应该如何精确处理失败,但需要额外的参数。一般不值得努力。
所以底线是:你做的不仅仅是返回一个可能是0
的指针。
答案 4 :(得分:0)
要选择性地返回元素,boost::optional<Item>
是一个很好的解决方案。 “optional”也将成为C ++ 17的一部分。
答案 5 :(得分:0)
如果你不想在字符串item_name和vector&amp;之间没有匹配的情况下返回空值。找到item_container,你可以返回一个值为“null”的字符串,值为0或类似的东西,以后你可以从其他函数处理,并没有给你任何问题