作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在我的项目冒险过程中,我意识到如果我想根据条件初始化参数,我不能利用新的 c++11 auto 关键字的优势。
基本上我有这样一个代码片段:
auto foo = bar::getfoo();
需要更改为:
FOO foo
if(cond){
foo = bar::getfoo();
} else {
foo = baz::getotherfoo();
}
但是我需要用类型声明 foo(因为编译器不知道我将使用相同的类型返回。我想知道在这种情况下是否有任何使用 auto 关键字的方法。我想出的另一个解决方案是使用 ? : 具有这样代码的运算符:
auto foo = cond ? bar::getfoo() : baz::getotherfoo();
但是如果有两个以上的函数可供选择,我真的不想链接 ? : 运营商。我想知道在这种情况下是否有任何好的模式可以使用。
最佳答案
您的直觉是使用 ? : 运算符是正确的 - 只初始化一个变量一次并避免冗余的默认构造/赋值循环是个好主意。
一种方法是将 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();
}
请注意,由于返回值优化,这是非常有效的。
如果你有 c++14,那就更好了——make_foo() 函数可以推断出它自己的返回类型:
auto make_foo() {
if (condition1()) {
return bar::getfoo();
}
else if(condition2()) {
return baz::getfoo();
}
else {
return banana::getfoo();
}
}
关于c++ auto 多选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30347182/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!