结构化for循环c ++

时间:2014-04-08 08:22:55

标签: c++ visual-studio-2012 c++11 struct

我想知道是否可以将struct放入for循环而不只是一个变量,我从this回答读取,但不能思考工作,这里是代码:

for(struct { int a; char b; } s = { 0, 'a' } ; s.a < 5 ; ++s.a) 
{
    std::cout << s.a << " " << s.b << std::endl;
}

错误是:

    error C2332: 'struct' : missing tag name
    error C2228: left of '.b' must have class/struct/union
    ...

如何使代码在c ++ 11,visual studio 2012上运行?

3 个答案:

答案 0 :(得分:3)

您可以使用std::tuplereference):

#include <tuple>

for(std::tuple<int,char> s(0,'a'); std::get<0>(s) < 5 ; ++std::get<0>(s)) 
{
    std::cout << std::get<0>(s) << " " << std::get<1>(s) << std::endl;
}

不确定这是MSVC2012的支持程度。 更新:它适用于MSVC2012。

答案 1 :(得分:2)

正如评论所指出的那样,有些编译器可能无法准确地给出您想要的结果。

如果您只是想将struct或变量类型的范围限制在有限的范围内(无需进入其他功能等),您可以在代码周围添加一些额外的括号,例如:

{ // scope start
struct X { int a; char b; };
for(X s = { 0, 'a' } ; s.a < 5 ; ++s.a) 
{
    std::cout << s.a << " " << s.b << std::endl;
}
} // scope end .. struct X no longer 'visible'

这样做的好处是更具“可读性”,并且有更好的机会与其他编译器“玩得很好”。

希望有所帮助

编辑:

即使上面的代码与VS2012不兼容,这就是DID与VS2012限制范围的关系:

{ // scope start
struct X { int a; char b; X(int z, char y) : a(z), b(y) {} };
for(X s(0, 'a') ; s.a < 5 ; ++s.a)
{
    std::cout << s.a << " " << s.b << std::endl;
}
} // scope end .. struct X no longer 'visible'

答案 2 :(得分:2)

我的建议:

struct X
{
    X(int a_, char b_)
        : a(a_), b(b_)
    {}
    int a; char b;
};

for(X s(0, 'a'); s.a < 5 ; ++s.a)
{
    std::cout << s.a << " " << s.b << std::endl;
}

你有两个问题(在VS 2012中,就是这样!): 1.在第一个for语句中声明一个结构。 2.使用大括号语法

初始化局部变量c

我分别为每个问题都会出错。但是上面的代码都解决了这两个问题。我希望这与你正在寻找的东西密切相关。