C++ 由于条件而不传递参数

C++ 由于条件而不传递参数,c++,c++11,ternary-operator,default-arguments,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_so

我有这个功能声明:

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);
void do_somthing(int a,int b,foo bar = get_special_foo());
但是,如果从默认参数的角度来看,
do\u somthing
是稳定的,但如果它更改为以下内容,则我的方法是可以接受的(甚至是好的吗?):

foo bar = get_bar_by_some_algorithm();
int a = 5,b = 6;
do_somthing(a,b,bar.empty()?foo():bar);
void do_somthing(int a,int b,foo bar = get_special_foo());
我的代码将过时,因为
foo()
也不相等
get\u special\u foo()

问题是在非空的情况下如何使用
运算符或任何短等价物传递参数,在空的情况下如何使用不传递任何内容

澄清示例(虚构语法):


您使用三元运算符的方法还可以,但似乎没有必要。在不考虑后果的情况下,在以后为函数添加新的默认值是不正常的。如果您的默认值没有意义,那么首先您的设计有问题

但为了娱乐你们,这里有一个无分支的版本。我可能会考虑这样的事情,如果我主要关心的是一个测量瓶颈由于分支错误预测。我通常不会这样做,因为这比一个简单的if语句更不清楚:


简而言之,您不能使用
?:
进行此操作

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

表达式中没有任何内容是矛盾的:它不计算任何内容,因此不能是
?:
运算符的操作数

注意:可以使用空语句(例如,通过使用独立的
)。但空语句不是表达式


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

三元运算符和
if
都将执行分支,顺便说一句。您只需传入
bar
,然后执行
if(bar.empty())
签入
do\u somthing
。您可以将分支预测替换为跳转预测。不,因为编译器应该将lambda省略为纯函数调用,这无论如何都会发生。无论如何,这只是一个示例。