我有以下代码:
Foo a;
if (some_fairly_long_condition) {
a = complicated_expression_to_make_foo_1();
} else {
a = complicated_expression_to_make_foo_2();
}
我有两个问题:
a
是const
,应该声明Foo()
被无缘无故地调用(也许这被优化了?)解决这个问题的一种方法是使用三元运算符:
const Foo a = some_fairly_long_condition?
complicated_expression_to_make_foo_1():
complicated_expression_to_make_foo_2();
这是好习惯吗?你是如何去做的?
答案 0 :(得分:2)
回答问题的第二部分:
我通常将初始化代码放入lambda:
const Foo a = [&]()->Foo{
if (some_fairly_long_condition) {
return complicated_expression_to_make_foo_1();
} else {
return complicated_expression_to_make_foo_2();
}
}();
在大多数情况下,您甚至可以省略尾随返回类型,因此您可以编写
const Foo a = [&](){ ...
就第一部分而言:
我说这在很大程度上取决于初始化代码的复杂程度。如果所有三个部分都是非常复杂的表达式(而不仅仅是函数调用),则使用三元运算符的解决方案变得难以理解,而lambda方法(或者单独的命名函数)允许您拆分这些部分进入各自的子表达式。
答案 1 :(得分:0)
如果问题是要避免使用ternaty运算符,并且您的目标是定义常量a,则此代码是一个选项:
Foo aux;
if (some_fairly_long_condition) {
aux = complicated_expression_to_make_foo_1();
} else {
aux = complicated_expression_to_make_foo_2();
}
const Foo a(aux);
这是一个很好的解决方案,没有任何新功能 - 如lambdas ---并且包含内联代码,如你所愿。