Удобное место, чтобы написать свою статью или просто почитать

Показаны статьи и заметки из категорий: Языки программирования ×

Кортеж (std::tuple) появился в стандартной библиотеке начиная с С++11. Это неоднородный список элементов, типы которых задаются или выводятся на этапе компиляции. Кортеж "похож" на пару (std::pair), однако он может содержать произвольное (хотя и конечное) количество элементов. Интерфейс кортежа довольно простой: http://en.cppreference.com/w/cpp/utility/tuple

Создать кортеж можно так:

#include <tuple>

std::tuple<std::string, int, double> tuple_("hello", 42, 3.14);

Про кортеж говорят, что это коллекция гетерогенных значений (разнородных). Поэтому тип элемента (value_type), который определен в любом стандартном контейнере, не имеет смысла в кортеже, и просто отсутствует, ровно как и любой из типов итераторов. Кортеж не является обычным контейнерным классом, и не отвечает концепции контейнеров в С++ (http://en.cppreference.com/w/cpp/concept/Container). Поэтому простого способа обхода элементов кортежа нет. К нему не применимы какие-либо циклы:

for (auto& x : tuple_);  // Ошибка компиляции!

error: no viable 'begin' function available

"Пройтись" по элементам кортежа можно только точно зная количество его аргументов на этапе компиляции. Для этого нужно использовать функцию get:

std::get<0>(tuple_); // индекс элемента в качестве аргумента шаблона
std::get<1>(tuple_);
std::get<2>(tuple_);

При этом передача индекса во время выполнения программы невозможна:

int i = 0;
std::get<i>(tuple_);  // Ошибка компиляции!

Однако, задействовав шаблонное метапрограммирование, можно создать более удобный способ обхода кортежа на этапе компиляции.

Читать полностью | | | | 12327



Все мы знаем, а многие даже читали, книгу Герба Саттера "Решение сложных задач на С++", которая появилась благодаря известным публикациям из серии под названием "Guru of the Week". Одна из задач в этой книге была посвящена std::uncaught_exception и звучала она так:

GotW #47: "Что собой представляет стандартная функция std::uncaught_exception и когда она должна использоваться?" 

Ответ дан в книге Саттера еще в далеком 2002 году. Однако, комитет решил вернуться к обсуждению этой "редкой" функции в 2013. Что же решили изменить и для чего все-таки нужна эта функция, я постараюсь "за 5 минут" рассказать в данном посте. Уделите время, и Вы также узнаете про декларативный подход в обработке ошибок, предложенный Александреску.

Читать полностью | | | | 3146



Такие функции-члены контейнеров как: size, empty, front, back и data - хорошо знакомы всем C++ программистам. Они давно являются незыблемым инструментом при разработке. Но, оказывается, в комитет поступило предложение, которое призвано улучшить работу с этими функциями.

Эта статья основана, и, фактически является переводом вот этого предложения N4017, которое поступило в комитет в мае прошлого года (2014). Автор Riccardo Marcangelo - кто это, узнать не удалось. Что же он предлагает?

Рикардо, говорит: давайте добавим в библиотеку глобальные функции: std::size, std::empty, std::front, std::back, и std::data, которые сейчас существуют в виде функций-членов контейнеров. Включение этих функций обеспечит преимущества в отношении безопасности, эффективности и универсальности. Все подробности ниже (статья очень короткая).

Читать полностью | | | | 2628

Показаны статьи и заметки из категорий: Языки программирования ×