在我与项目的冒险中,我意识到如果我想根据条件初始化参数,我不能利用新的c ++ 11 auto关键字的优势.
基本上我有一个像这样的代码片段:
auto foo = bar::getfoo();
Run Code Online (Sandbox Code Playgroud)
需要改为:
FOO foo
if(cond){
foo = bar::getfoo();
} else {
foo = baz::getotherfoo();
}
Run Code Online (Sandbox Code Playgroud)
但后来我需要用类型声明foo(因为编译器不能知道我将使用相同类型的返回.我想知道在这种情况下是否有任何使用auto关键字的方法.另一个解决方案是我想到的是使用带有这样代码的?:运算符:
auto foo = cond ? bar::getfoo() : baz::getotherfoo();
Run Code Online (Sandbox Code Playgroud)
但如果有两个以上的功能可供选择,我真的不想连锁吗?:运营商.我想知道在这种情况下是否有任何好的模式.
你的直觉使用?:运算符是正确的 - 最好只将变量初始化一次并避免冗余的默认构造/赋值周期.
一种方法是将Foo创建的选择推迟到一个小的实用程序函数:
auto make_foo() -> decltype(bar::getfoo())
{
if (condition1()) {
return bar::getfoo();
}
else if(condition2()) {
return baz::getfoo();
}
else {
return banana::getfoo();
}
}
void foo_test() {
auto foo = make_foo();
}
Run Code Online (Sandbox Code Playgroud)
请注意,由于返回值优化,这非常有效.
如果你有c ++ 14它甚至更好 - make_foo()函数可以推导出它自己的返回类型:
auto make_foo() {
if (condition1()) {
return bar::getfoo();
}
else if(condition2()) {
return baz::getfoo();
}
else {
return banana::getfoo();
}
}
Run Code Online (Sandbox Code Playgroud)
这decltype
是为了什么.它将为您提供表达式的类型,而无需实际评估(并且您可以在关闭的情况下实现auto):
decltype(bar::getfoo()) foo;
if (....) {foo = ...;} else {foo = ...;}
Run Code Online (Sandbox Code Playgroud)