Мне действительно нравится Ranged-based-for-loop, который поддерживается C ++ 11 и выше.Я хотел бы по какой-то причине понять, чтобы смоделировать это.Вот пример:
// 1
//#define ranged_for(X, T) \
// for (std::vector<int>::iterator beg{ T.begin() },\
// end{ T.end() }; beg != end; X = *beg, ++beg)\
// 2
//#define ranged_for(X, T) \
// for (std::vector<int>::iterator beg{ T.begin() },\
// end{ T.end() }; beg != end; ++beg, X = *beg)\
// 3
#define ranged_for(X, T) \
for (std::vector<int>::iterator beg{ T.begin() },\
end{ T.end() }; beg != end; ++beg)\
X = *beg,
int main(){
std::vector<int> data{75, 435, 6578, 92, 123};
auto i{ 0 };
ranged_for(i, data)
std::cout << i << std::endl;
std::cout << std::endl;
std::cin.get();
return 0;
}
Как вы можете видеть выше, первый макрос не получает первый элемент 75
, но вместо него значение 0
и последний отсутствует.Это потому, что я думаю, что в моем основном я печатаю x
перед тем, как назначить его в части цикла после итерации.
Второй макрос приводит к сбою программы, потому что я думаю, что отмена ссылки на последний узел (сторожевой узел).
Третий работает нормальноно, как вы можете видеть после расширения макроса, я получу:
i = *beg, std::cout << i << std::endl;
Это потому, что строка выше обрабатывается как один оператор.Есть ли лучший способ и объяснение.Спасибо всем хорошие парни!