如何迭代变量?

问题描述:

如果我的代码:如何迭代变量?

T a; 
T b; 
T c; 
// ... 
T z; 

如何,我可以遍历它们,而无需创建他们的std::vector<T&>

任何漂亮的解决方案,像(伪):

for (auto& it : [a, b, c, d, e, f]) { 
    // ... 
} 

(无复印件)

+0

你甚至不能创建'std :: vector '。 – juanchopanza

+0

一般你不能。您可以创建一个包含变量值*副本的临时向量。 –

+0

@JoachimPileborg - 这会复制变量,是吗? –

for (auto& var : {std::ref(a), std::ref(b), std::ref(c), std::ref(d), std::ref(e), std::ref(f)}) { 
    // ... 
} 

应该做的工作。

+1

是否有任何理由不会简单地写'for(auto it:{&a,&b,&c})...' ? –

+0

@ H.Guijt:要有一个更透明的用法(你必须解除引用),但它是一个有效的选择。 – Jarod42

如果你不想实际修改“变量”,那么你也许可以做到像

// TODO: Put your own variables here, in the order you want them 
auto variables = { a, b, c, .... }; 

// Concatenate all strings 
std::string result = std::accumulate(std::begin(variables), std::end(variables), "", 
    [](std::string const& first, std::string const& second) 
    { 
     return first + ' ' + second; // To add spacing 
    }); 

注意,这需要所有的“变量”是同一类型(std::string)的。如果您有一个不是字符串的变量,您可以使用std::to_string在第一步中对其进行转换。

+0

你的'initializer_list'做了一个副本。 – Jarod42

+0

@ Jarod42在大多数情况下,它真的没什么好担心的。我们不知道OP的用例,如果OP每秒多次这样做,那么可能是一个问题。如果OP在10小时的运行时间内执行一次或两次,那么这是非常不重要的。这是关于上下文(我们没有)。如果这被认为是一个瓶颈,那么可以使用'std :: cref'代替。 –

+0

OP明确指出,*“(无副本)”*。但我在实践中大多同意。 – Jarod42