在可用的C++中,最好使用auto许多变量,特别是那些类型已知但输入很烦人的变量:
weird_template_type<int,char>::subtype::recursive_subtype some_function() {
// ...
}
// ...
auto val = some_function();
Run Code Online (Sandbox Code Playgroud)
当有意义时,例如对于锁定,对RAII对象使用微范围也是很好的:
some_setup_code();
int val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
Run Code Online (Sandbox Code Playgroud)
有没有办法混合这两个习语,例如当你的共享内存读取代码返回一个奇怪的类型?
明显的版本不起作用:
auto val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
Run Code Online (Sandbox Code Playgroud)
由于auto没有初始化程序的变量,这在编译时失败.
同样,您不能在范围块内声明变量,否则以后就无法使用它.
我能看到的唯一直接选项是1.明确地输出变量声明(bleah),或者2.使用auto其他一些你知道属于同一类型的表达式(不是改进).还有其他方法吗?
Nic*_*las 15
基本上,你所说的是复杂的变量初始化.典型的解决方案是使用lambda:
auto val = [&]() {
lock_guard<mutex> lk(mut);
return read_shared_memory();
}();
Run Code Online (Sandbox Code Playgroud)
你可以考虑一下
decltype(read_shared_memory()) val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
Run Code Online (Sandbox Code Playgroud)
虽然它不一定不那么冗长.