Сообщения

Сообщения за январь, 2018

Полезные новации С++17. Вывод аргументов шаблона для конструкторов шаблонных классов.

Вероятно, вы часто использовали в своих программах вызовы шаблонных функций, подобных std::make_pair или std::make_move_iterator , при этом удивляясь необходимости использования вспомогательной функции для создания нужного объекта. Проблема заключается в отсутствии вывода шаблонных аргументов для конструкторов шаблонных классов. Рассмотрим простой класс pair : template <typename T, typename U> struct pair {     T t;     U u;     pair (const T& t, const U& u) : t{t}, u{u} {} };  Поскольку отсутствует вывод аргументов для имеющегося конструктора, нам необходимо явно специфицировать шаблонные аргументы при конструировании pair , например вот так: pair<int, float> a{1, 0.5f}; Было бы удобнее иметь возможность написать так: pair a{1, 0.5f}; но это невозможно. Общим решением является предоставление вспомогательной функции, которая выполняет выведение типов: template <typename T, typename U> pair<T,U> make_pair...

Полезные новации С++17. constexpr if.

if времени компиляции для С++! Свойство позволяет нам отбрасывать ветви утверждения if во время компиляции, основываясь на условии константного выражения. if constexpr (cond) statement1 ; // Discarded if cond is false else statement2; // Discarded if cond is true Например: template < typename T> auto get_value (T t) { if constexpr ( std ::is_pointer_v<T>) return *t ; else return t; } #include <iostream> #include <memory> template <typename T> auto get_value(T t) {     if constexpr (std::is_pointer_v<T>)         return *t;     else         return t; } int main() {      auto pi = std::make_unique<int>(9);      int i = 9;            std::cout << get_value(pi.get()) << "\n";      std::cout << get_value(i) << "\n"; } ...

Полезные новации С++17. Структурированное связывание.

Вы часто работаете с кортежами? Если нет - то, возможно, будете - прочитав нижеследующее. Не только кортежи предполагают возвращение множества значений из функции, но они также имеют специальную языковую поддержку, делающую код более легким и понятным. Например ( std::tie example ): std :: set <S> mySet; S value{ 42 , "Test" , 3.14 }; std :: set <S>::iterator iter; bool inserted; // unpacks the return val of insert into iter and inserted std ::tie(iter, inserted) = mySet.insert(value); if (inserted) std :: cout << "Value was inserted\n" ; Заметьте, что вам необходимо сначала объявить iter и inserted. Затем, можно использовать std::tie для создания кортежа. Переопределённый оператор присваивания кортежа может принимать пару (pair<>) значений. С С++17: std :: set <S> mySet; S value{ 42 , "Test" , 3.14 }; auto [iter, inserted] = mySet.insert(value);  И всё! Дело в волшебных квадратных скобках! П...

Полезные новации С++17. Инициализирующее выражение для if/switch.

Новая версия выражений  if и switch для С++: if (init; condition)  и  switch (init; condition) . Ранее мы должны были писать так: { auto val = GetValue(); if (condition(val)) // on success else // on false... } Фигурные скобки введены сознательно, дабы ограничить область видимости val и предотвратить его "утечку" в окружающее выражение. Теперь мы можем написать: if ( auto val = GetValue(); condition(val)) // on success else // on false... val теперь видимо только внутри if и else выражений ("утечка" исключена). condition может быть любым условием - не только для случая, когда val имеет булево значение. Почему это полезно? Допустим мы хотим найти что-то в строке: const std :: string myString = "My Hello World Wow" ; const auto it = myString.find( "Hello" ); if (it != std :: string ::npos) std :: cout << it << " Hello\n" const...