对嵌套范围中经常重复出现的变量类型使用相同的名称
Using same name for kind of variable commonly re-occurring in a nested scope
我经常写这样的东西:
const auto end = some_container.end();
for( auto it = some_container.begin(); it != end; ++it )
{
const auto &item_container = *it;
const auto end = item_container.end()
for( auto it = item_container.begin(); it != end; ++it )
{
do_awesome_stuff_with_the_iterator();
}
}
除了第二个变量end
和it
的名称,到目前为止,我已经给出了不同的名称。为子范围中的另一个变量"重用"相同的名称是否是一种糟糕的风格/做法?我知道您将无法访问外部end
和it
变量,但这不是必须的。我不认为这令人困惑(奇怪的后缀名字在我眼中更丑陋),但有具体的理由不这么做吗?
既然已经标记了c++0x
,为什么不简单地将std::foreach()
与lambda函数一起使用呢?
我手头没有一个支持lambda的编译器,但应该有这样的功能:
// Beware, brain-compiled code ahead!
std::foreach( some_container.begin()
, some_container.end()
, [](some_element& v) {
std::foreach( v.begin()
, v.end()
, [](another_element& u) {
do_awesome_stuff_with_the_element(u);
}
}
);
然而,有了新的基于范围的循环,这可能会变得更加可读:
// Beware, brain-compiled code ahead!
for (auto& v: some_container)
for(auto& u : v)
do_awesome_stuff_with_the_element(u);
正如您所说,在您的案例中重用变量名的唯一问题是您无法访问外部作用域变量。
在您的情况下不是这样,但如果您出于不同的目的使用具有相同名称的变量,这确实可能会降低代码的可读性(在您的案例中,这不是问题,因为end
和it
的工作方式相同)。
还有第三个问题,具有相同名称的变量通常会使调试过程变得困难,尽管若您只使用日志记录而不使用调试器工具,那个可能就不需要担心了。
这取决于上下文。在这种情况下,我建议重用it
是有问题的,但end
可能是可以的。您只能在一个明确的位置使用end
的每个实例。但是,阅读内部循环的人可能会对您所指的it
感到困惑,因为声明中更多地删除了使用。
当然,阅读任何一个循环的人可能会被it
一开始的意思弄糊涂;我会从一开始就选择一个更好的名字,然后重用它们应该是一种更罕见的情况。
我认为重复使用相同的变量名是一个迹象,因为这些名称对该函数的描述不够。
如果要对多个容器进行迭代,变量名应该指示它们要对哪些内容进行迭代,这些内容与容器或容器中包含的类型有关。
相关文章:
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 指针数据类型变量如何包含对象?
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- 如何为结构类型变量赋值
- 如何将字符类型变量附加到字符串中?
- 共享或私有 openmp 代码中的结构化类型变量
- 有没有办法在 c++ 中制作类型变量?
- 从其他类声明类类型变量会给出 C2143 错误(在"*"之前缺少";")
- 如何检查类中定义的枚举类型变量是否被分配给?
- 将子类实例保存在父类型变量中并通过父变量使用 Child 函数?
- 是否可以在没有结构的情况下创建新的类型变量?
- 为什么类型变量;不调用默认 CTR
- 如何使用CIN将输入整数值获取到char类型变量中
- 如何为 char** 类型变量提供适当的值,以便将其分配给字符串变量
- 在C++标准中哪里说必须初始化 const 内置类型变量的定义
- 为什么可以将其他类型变量用作C 中常量参考参数参数的参数
- Eclipse CDT 打开声明的自动类型变量
- 如何计算长长类型变量中的位数
- 将自动类型变量初始化为零.这种类型安全吗?