从函数返回时,我经常使用-1
作为无效值类型,其中输入产生错误的输出。例如,编写索引超出范围的索引函数,而不是抛出异常,可以返回-1
。但是当编写具有负值的函数作为可能的返回类型时,此技术不起作用。在这种情况下返回无效类型值的正确方法是什么?
我主要使用的技术是将返回类型设置为*int
类型,并将指针返回NULL
。但是,这要求所有返回值都是指针类型,这似乎是函数的额外开销。在这种情况下,是否有可接受的返回值标准?
答案 0 :(得分:30)
在较新的C ++中,我建议使用{% filter replace({'foo': '…'})|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%确定它会成功)可能看起来有点冗长,但恕我直言:
std::optional<>
和默认值处理相同std::terminate()
,嗯,你知道会发生什么if
/ catch
/等。我看到的唯一问题是构造函数初始化列表。有什么想法吗?