joh*_*ers 5 c++ arrays templates template-argument-deduction for-range
似乎C++ 11中可用的"for each"语法允许在不知道数组的实际大小(元素数量)的情况下进行数组迭代.我认为,因为它是新标准的一部分,所以这是非常安全的,即使对于C阵列也是如此.通常,在操作C数组之前,您还必须单独知道C数组的大小,但我希望任何有这种新C++技术经验的人都可以验证它是否与您期望的完全相同:
extern float bunch[100];
for (float &f : bunch) {
f += someNumber;
}
Run Code Online (Sandbox Code Playgroud)
对于这种技术,我应该知道哪些非明显的副作用或缺点?它在我看到的代码中没有显示太多,可能是因为大多数代码都是在标准之前编写的.想要确保它的罕见用法不是因为其他一些不为人知的原因.
这种用法并没有什么奇怪或不安全的地方。数组的大小在编译时已知,因此可以在循环中使用。这是一个模板函数的示例,可让您找出数组的长度:
template< class T, std::size_t N >
std::size_t length( const T (&)[N] )
{
return N;
}
Foo f[5];
std::cout << length(f) << "\n";
Run Code Online (Sandbox Code Playgroud)
这应该清楚地表明您不能在动态大小的 C 样式数组上使用此技术或基于范围的循环。
当然,如果你有基于范围的循环,那么你也应该有std::array(如果没有,你可能可以从 tistd::tr1或 boost 获取),这样你就可以完全避免 C 风格的数组:
extern std::array<float, 100> bunch;
for (auto &f : bunch) {
f += someNumber;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2558 次 |
| 最近记录: |