C++11 外部作用域变量声明为 auto
C++11 outer scope variable declared auto
在可用的 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);
有没有办法混合这两个成语,例如当你的共享内存读取代码 returns 是一个奇怪的类型时?
明显的版本不起作用:
auto val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
由于 auto
变量没有初始化器,这在编译时失败。
同样,您不能在作用域块内声明变量,否则稍后将不可用。
我能看到的唯一直接选项是 1. 显式键入变量声明 (bleah),或 2. 将 auto
与您知道属于同一类型的其他表达式一起使用(不是改进).还有其他方法吗?
你可以考虑
decltype(read_shared_memory()) val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
尽管它不一定不那么冗长。
基本上,您所说的是复杂的变量初始化。典型的解决方案是使用 lambda:
auto val = [&]() {
lock_guard<mutex> lk(mut);
return read_shared_memory();
}();
您可以为此创建一个辅助函数:
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);
在可用的 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);
有没有办法混合这两个成语,例如当你的共享内存读取代码 returns 是一个奇怪的类型时?
明显的版本不起作用:
auto val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
由于 auto
变量没有初始化器,这在编译时失败。
同样,您不能在作用域块内声明变量,否则稍后将不可用。
我能看到的唯一直接选项是 1. 显式键入变量声明 (bleah),或 2. 将 auto
与您知道属于同一类型的其他表达式一起使用(不是改进).还有其他方法吗?
你可以考虑
decltype(read_shared_memory()) val;
{
lock_guard<mutex> lk(mut);
val = read_shared_memory();
}
do_something(val);
尽管它不一定不那么冗长。
基本上,您所说的是复杂的变量初始化。典型的解决方案是使用 lambda:
auto val = [&]() {
lock_guard<mutex> lk(mut);
return read_shared_memory();
}();
您可以为此创建一个辅助函数:
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);