在可用的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与您知道的相同类型的其他表达式一起使用(而不是改进)。还有别的办法吗?
发布于 2017-02-04 06:15:37
基本上,您正在谈论的是复杂的变量初始化。典型的解决方案是使用lambda:
auto val = [&]() {
lock_guard<mutex> lk(mut);
return read_shared_memory();
}();发布于 2017-02-04 06:15:25
你可以考虑
decltype(read_shared_memory()) val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);尽管它不一定不那么冗长。
发布于 2017-02-04 06:27:51
您可以为此创建一个辅助函数:
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);https://stackoverflow.com/questions/42033806
复制相似问题