2016-07-22 4 views
2

Если у меня есть код:Как я могу перебирать переменные?

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 - это скопирует переменные, да? –

ответ

9
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: Чтобы иметь более прозрачное использование (вы должны разыгрывать 'it'), но это действительная альтернатива. – Jarod42

2

Если вы не хотите, чтобы на самом деле изменить «переменные», то вы могли бы сделать что-то вроде

// 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 делает это несколько раз в секунду, то да, это может быть проблемой. Если ОП работает один или два раза в течение десятичасового периода времени, то это действительно незначительно. Это все о контексте (которого у нас нет). Если это измеряется как узкое место, возможно, вместо этого используйте 'std :: cref'. –

+0

OP указано явно, * "(Без копий.)" *. Но я в основном согласен на практике. – Jarod42

Смежные вопросы