在可用的C ++中,将auto
用于许多变量是一种很好的做法,特别是那些类型已知但输入很烦人的变量:
weird_template_type<int,char>::subtype::recursive_subtype some_function() {
// ...
}
// ...
auto val = some_function();
在有意义的情况下使用显微镜对RAII对象也很好,例如锁定:
some_setup_code();
int val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
有没有办法混合这两个习语,例如当你的共享内存读取代码返回一个奇怪的类型?
显而易见的版本不起作用:
auto val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
由于没有初始值设定项的auto
变量,这在编译时失败。
同样,您不能在范围内的块中声明变量,否则以后就无法使用它。
我能看到的唯一直接选项是1.明确地输出变量声明(bleah),或2.使用auto
和其他你知道属于同一类型的表达式(不是改进)。还有其他方法吗?
答案 0 :(得分:15)
基本上,你所说的是复杂的变量初始化。典型的解决方案是使用lambda:
auto val = [&]() {
lock_guard<mutex> lk(mut);
return read_shared_memory();
}();
答案 1 :(得分:8)
您可以考虑
decltype(read_shared_memory()) val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
虽然不一定不那么冗长。
答案 2 :(得分:3)
您可以为此创建一个辅助函数:
int read_shared_int_memory(std::mutex &mut);
{
std::lock_guard<std::mutex> lock(mut);
return read_shared_memory();
}
然后,简单地说:
auto val = read_shared_int_memory(mut);