День добрый.
Просматривал сейчас очередную статейку на тему, что нового нам чудный мир несет
И появился в голове вопрос по поводу использования auto.
Одним из самых приятных для меня моментов в использовании auto, это возможность не писать тип итератора.
container::iterator it = cont.begin(); // 1auto it = cont.begin(); //2
И вот тут интересно. У нас auto всегда будет трактоваться как в первой строчке или счастье все-таки может быть полным и есть возможность в случае необходимости заставить компилятор трактовать вторую строку следующим образом:
Здравствуйте, ilvi, Вы писали:
I>День добрый. I>Просматривал сейчас очередную статейку на тему, что нового нам чудный мир несет I>И появился в голове вопрос по поводу использования auto. I>Одним из самых приятных для меня моментов в использовании auto, это возможность не писать тип итератора.
I>
I>container::iterator it = cont.begin(); // 1
I>auto it = cont.begin(); //2
I>
I>И вот тут интересно. У нас auto всегда будет трактоваться как в первой строчке или счастье все-таки может быть полным и есть возможность в случае необходимости заставить компилятор трактовать вторую строку следующим образом:
I>
I>container::const_iterator it = cont.begin(); // 3
I>
в стандартных контейнерах добавятся методы cbegin и cend, которые будут возвращать container::const_iterator, так что:
Здравствуйте, ilvi, Вы писали:
I>День добрый. I>Просматривал сейчас очередную статейку на тему, что нового нам чудный мир несет I>И появился в голове вопрос по поводу использования auto. I>Одним из самых приятных для меня моментов в использовании auto, это возможность не писать тип итератора.
I>
I>container::iterator it = cont.begin(); // 1
I>auto it = cont.begin(); //2
I>
I>И вот тут интересно. У нас auto всегда будет трактоваться как в первой строчке или счастье все-таки может быть полным и есть возможность в случае необходимости заставить компилятор трактовать вторую строку следующим образом:
I>
I>container::const_iterator it = cont.begin(); // 3
I>
... I>Это понятно. Но как-то заводить копию контейнера для этого
Зачем копию?! Достаточно каста в константную ссылку. I>Нововведение, о котором упомянул Jazzer http://rsdn.ru/forum/cpp/3763212.1.aspx
Здравствуйте, ilvi, Вы писали:
... ЮЖ>>т.к. функция 'begin' имеет две версии, константную и "обычную".
I>Это понятно. Но как-то заводить копию контейнера для этого
B>auto it = const_cast<const container_t&>(cont).begin()
B>
B>А вот чтоб само — тут так, а там вот так — очень вряд ли
Вообще-то нетрудно автоматизировать...
template<typename T> T const& toConstRef( T& t ) { return t; }
template<typename T> T const& toConstRef( T const& t ) { return t; }
auto it = toConstRef( cont ).begin();
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском