c++ - 由于条件而不传递参数

标签 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() 也不等于 get_special_foo()

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

说明示例(虚构语法):

do_somthing(a,b,bar.empty()? the_default_argument : bar);

最佳答案

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

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

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 );

关于c++ - 由于条件而不传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36125549/

相关文章:

c++ - 没有匹配的函数来调用

android - 找不到 opencv.hpp?安卓NDK

c++ - 矩阵的行、列和对角线之和

java - Java中带盒装类型的三元条件的奇怪行为

javascript - 三元运算的值范围在负值和正值范围内直到 0?

C# ? : operator

c++ - 从函数参数包中删除最后一项

c++ - 带有引用变量的单例

c++ - 尝试将函数作为参数传递时未解析的重载函数类型

c++ - for 循环初始化中的 auto 和 decltype