我想知道是否可以将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上运行?
答案 0 :(得分:3)
您可以使用std::tuple
(reference):
#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我分别为每个问题都会出错。但是上面的代码都解决了这两个问题。我希望这与你正在寻找的东西密切相关。