由于条件

时间:2016-03-21 07:48:09

标签: c++ c++11 ternary-operator default-arguments

我有这个函数声明:

void do_somthing(int a,int b,foo bar = foo());

我想把它称为一些论据如下:

foo bar = get_bar_by_some_algorithm();
int a = 5,b = 6;
if(bar.empty()){
    do_somthing(a,b);
}
else{
    do_somthing(a,b,bar);
}

我想摆脱if声明。所以,我这样做了:

foo bar = get_bar_by_some_algorithm();
int a = 5,b = 6;
do_somthing(a,b,bar.empty()?foo():bar);

但是,如果do_somthing从默认参数的角度来看是稳定的,但是如果它变为这样的话,我的方法是可以接受的(甚至是好的吗?):

void do_somthing(int a,int b,foo bar = get_special_foo());

我的代码已过时,因为foo()也不相等{。{1}}。

问题是如何在非空的情况下使用get_special_foo()运算符或任何简短的等价运算符来传递参数,在空的情况下如何使用 NOT传递

澄清示例(虚构语法):

?

2 个答案:

答案 0 :(得分:2)

你使用三元运算符的方法没问题,但似乎没必要。在不考虑后果的情况下,在以后拍摄功能的新默认值是不正常的。如果您的默认值没有意义,那么您的设计首先出现问题。

但只是为了招待你,这是一个无分支的版本。如果由于分支错误预测导致我的主要关注点是一个严重的瓶颈,我可能会考虑这样的事情。我通常不这样做,因为它不如简单的 if-statement 那么清晰:

static auto do_something[2] = {
    +[]( int a, int b, foo bar ) { do_something( a, b, bar ); },
    +[]( int a, int b, foo bar ) { do_something( a, b ); }
};
do_something[bar.empty()]( a, b, bar );

答案 1 :(得分:1)

简短的回答是,您无法使用?:

?:三元运算符的规范要求所有三个操作数都是有效的表达式。有效表达式(过于简单化)是一种构造,它用于计算一个或多个值,(可选)使用运算符对值进行操作,并生成结果。

其中没有任何内容的表达式是一个矛盾:它不会评估任何内容,因此不能成为?:运算符的操作数。

注意:可以使用空语句(例如,通过隔离;)。但空洞的陈述不是表达。

隐藏if()的明显解决方案是在您的函数内部进行测试,如CompuChip的评论中所述。或者编写一个包装函数来为你做测试(并确保你的do_somthing()没有在任何其他编译单元中声明,以避免直接调用它而不是包装器的诱惑。)