Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我如何在两个其他函数返回状态';成功?_C++_C++11 - Fatal编程技术网

C++ 我如何在两个其他函数返回状态';成功?

C++ 我如何在两个其他函数返回状态';成功?,c++,c++11,C++,C++11,我有一个函数依赖于其他两个函数的成功返回状态。也就是说,如果任何一个函数出现故障,第三个函数需要更新自身中的某些内容以反映这一点,但仍需继续。是否有一种干净的方法来执行第三个功能,而不冗余 在我的例子中,我有以下内容,其中func1和func2返回成功或失败: bool status; bool status2; status = func1(); status2 = func2(); if (status && status2){ func3(other_args,true)

我有一个函数依赖于其他两个函数的成功返回状态。也就是说,如果任何一个函数出现故障,第三个函数需要更新自身中的某些内容以反映这一点,但仍需继续。是否有一种干净的方法来执行第三个功能,而不冗余

在我的例子中,我有以下内容,其中
func1
func2
返回成功或失败:

bool status;
bool status2;
status = func1();
status2 = func2();
if (status && status2){
 func3(other_args,true)
else func3(other_args, false);
我觉得这一点都做得不好。My
func3
执行过多信息的写入,并依赖于知道执行的操作是否失败。有没有更干净的方法来实现第三个函数调用

我最初的想法是:

if (func1 && func2){
    func3(some_other_args, true)
else func3(some_other_args, false)

这是正确的思维方式,还是这里有更干净的东西?

只需将条件作为参数传递,以避免分支

status = func1();
status2 = func2();
func3(other_args, (status && status2))

只需将条件作为参数传递,以避免分支

status = func1();
status2 = func2();
func3(other_args, (status && status2))

在你的情况下,你可以写:

auto status = func1();
auto status2 = func2();
func3(other_args, status && status2);

或者也许我不太明白你的问题

在你的情况下,你可以写:

auto status = func1();
auto status2 = func2();
func3(other_args, status && status2);

或者我不太理解你的问题,因为你真的想要两种结果,那么如果执行顺序对你来说不重要,你能得到的最短时间就是不要短路:

func3(other_args, func1() & func2());
但是,当您在几周后返回代码并“纠正”连接时,很容易出现错误修复(“德语中的verschlimmbessern”)

更稳健的解决方案是

auto status = func1();
auto status2 = func2();
func3(other_args, status && status2);

由于您确实想要这两种结果,因此如果执行顺序对您来说并不重要,您可以得到的最短结果是不短路:

func3(other_args, func1() & func2());
但是,当您在几周后返回代码并“纠正”连接时,很容易出现错误修复(“德语中的verschlimmbessern”)

更稳健的解决方案是

auto status = func1();
auto status2 = func2();
func3(other_args, status && status2);

可能是其他C++方式:通过<代码>函数>(/COD>)和<代码>函数2>(<代码> >自身>为代码>函数3>(<)>代码>,它还负责函数返回状态,如::/p>

void func3(other_args i, decltype(func1) f1, decltype(func2) f2){
    if (f1() && f2()) { 
        //do true 
    }
    else {
        //do false
    }   
}
这样
func3()
调用会变得更干净:

func3(other_args, func1, func2);

可能是其他C++方式:通过<代码>函数>(/COD>)和<代码>函数2>(<代码> >自身>为代码>函数3>(<)>代码>,它还负责函数返回状态,如::/p>

void func3(other_args i, decltype(func1) f1, decltype(func2) f2){
    if (f1() && f2()) { 
        //do true 
    }
    else {
        //do false
    }   
}
这样
func3()
调用会变得更干净:

func3(other_args, func1, func2);

是的,或者更简洁:
func3(其他参数,func1()&&func2())
@Magix不等价-func2()可能不会被调用。是的,或者更简洁:
func3(其他参数,func1()&&func2())
@Magix不等价-func2()可能不会被调用。这与
func3(一些其他参数,状态和状态2)不一样吗
?虽然这个问题只能得出基于观点的答案,但在这些情况下,我的想法是始终使用最具人类可读性的内容。毫无疑问,总有一天你会回来维护这个代码(或者,其他人会)。编译器将根据需要进行任何优化,无论您是将其作为顶级代码集编写,还是作为底层代码集编写,或是作为问题的其他注释编写。因此,不太可能存在一个技术原因来取代另一个。可维护性应该是这里主要关注的问题。假设在第二个示例中,您打算实际调用f1和f2,我应该警告您,如果f1失败,则不会调用f2,而您的第一个版本的代码将调用这两个函数。这可能很重要!使用&而不是&&将修复这个bug,但正如@molbdnilo所说的,这很容易“修复”。func3(soa,func1()*func(2))与
func3(其他一些参数,状态和状态2)
?虽然这个问题只能导致基于观点的答案,但在这些情况下,我的想法是始终使用人类可读性最强的答案。毫无疑问,总有一天你会回来维护这个代码(或者,其他人会)。编译器将根据需要进行任何优化,无论您是将其作为顶级代码集编写,还是作为底层代码集编写,或是作为问题的其他注释编写。因此,不太可能存在一个技术原因来取代另一个。可维护性应该是这里主要关注的问题。假设在第二个示例中,您打算实际调用f1和f2,我应该警告您,如果f1失败,则不会调用f2,而您的第一个版本的代码将调用这两个函数。这可能很重要!使用&而不是&将修复此错误,但正如@molbdnilo所说,这很容易“修复”。func3(soa,func1()*func(2))我仍然会在那里添加一条注释,即无论
status1
如何,都必须调用
func2
。另一个选项可能是使用*而不是&,因为它不太可能“修复”在&&I中仍然会添加一条注释,说明无论
status1
如何,都必须调用
func2
。另一个选项可能是使用*而不是&,因为它不太可能在&&func1中“固定”,而func2仍然需要括号:
func1()&&func2()
func1和func2仍然需要括号:
func1()&&func2()