我有这个函数声明:
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传递?
澄清示例(虚构语法):
?
答案 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()
没有在任何其他编译单元中声明,以避免直接调用它而不是包装器的诱惑。)