Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

C++ OpenFest 2015

734 vues

Publié le

What's new in C++11/14/17

Publié dans : Développement personnel
  • Soyez le premier à commenter

C++ OpenFest 2015

  1. 1. C++ на стероиди Николай Николов • 08.11.2015
  2. 2. “Programming is thinking, not typing.” Casey Patton
  3. 3. 2002 Започва работата по C++0x 2003 “Бъг фикс” на ISO C++ Няма промяна в езика от гледна точка на програмиста 2011 Публикуван е стандарта C++11 Множество промени в езика 2014 Публикуван е стандарта C++14 2015 Работа по C++17 Приблизително 4,4 млн потребителя на езика
  4. 4. auto int func(); auto f = func(); // f е int std::vector<int> v; auto e = v.end(); // std:: vector<int>>::iterator Типът автоматично се извлича при инициализацията. auto променлива не може да остане не инициализирана. Type deduction (Effective Modern C++).
  5. 5. range-based цикли std::list<std::string> list; for( auto &s: list ) { s.clear(); } int sum = 0; for( auto n: { 1, 2, 3, 4 } ) { sum += n; } int a[] = {0, 1, 2, 3, 4, 5}; for(int n: a) { std::cout << n << ' '; } Изпълпълнява цикъл върху контейнер. { auto && __range = range_expression; for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) { range_declaration = *__begin; loop_statement } }
  6. 6. ламбда изрази int var; auto lam = [&var]( int param ) -> bool { return var == param; } if( lam(5) ) { … } Конструира безименен функционален обект, който може да прихваща променливи. Особено удобни за употреба заедно с функциите, предоставени от <algorithm>. Могат да се използват като слотове в Qt5. C++14 добавя генерализирани ламбда изрази и възможност за изрази при прихващенето.
  7. 7. constexpr constexpr int v = 10; constexpr int make_value( int k ) { return k + v; } class Point { public: constexpr Point( int _x, int _y ) noexcept: x{_x}, y{_y} {} private: int x; int y; }; Показва, че променливата или функцията може да се използва в константен израз. Константните изрази се изпълняват по време на компилация.
  8. 8. user-defined literals constexpr uint64_t operator"" _KB ( unsigned long long int val ) { return val * 1024; } uint64_t data_size = 2_KB; Позволява целочислени, с плаваща запетая или текстови литерали да създават потребителки дефинирани типове. В С++14 STL предоставя готови литерали за основни типове данни.
  9. 9. псевдоними // typedef std::ios_base::fmtflags flags; using flags = std::ios_base::fmtflags; // typedef void (*func)(int, int); using func = void (*) (int,int); // template type alias template<class T> using ptr = T*; // името 'ptr<T>' вече е псевдоним на указател към типа T ptr<int> x; ● Типови псевдоними - подобни на typedef ● Шаблонни псевдоними
  10. 10. move семантика class_name ( class_name && ) { ... } class_name & class_name::operator= ( class_name && ) { ... } ● move конструктор ● move оператор за присвояване ● std::move ● Return value optimization (RVO)
  11. 11. std::move void use_vector( std::vector v ) { … } std::vector big_vector; // работа с big_vector use_vector( big_vector)); // още работа с big_vector void use_vector( std::vector v ) { … } std::vector big_vector; // работа с big_vector use_vector( std::move(big_vector) ); // big_vector вече е празен, може променливата да се преизползва
  12. 12. Return value optimization (RVO) class Thing { public: Thing(); ~Thing(); Thing(const Thing&); }; Thing f() { Thing t; return t; }
  13. 13. умни указатели ● std::unique_ptr ● std::shared_ptr ● std::weak_ptr
  14. 14. Пример unique_ptr<T> do_stuff( unique_ptr<T> u ) { // just use T return u; // move или RVO } int main() { unique_ptr<T> p; // *p... p = do_stuff( move(p) ); // move // *p... return 0; } void do_stuff( shared_ptr<MyClass> u ) { // just use MyClass // --ref count } int main() { shared_ptr<MyClass> p; // *p... do_stuff( p ); // ++ref count // *p... return 0; }
  15. 15. variadic templates Позволяват създаването на темплейти с променлив брой параметри.
  16. 16. Очаквания за C++17 Concepts Целта е да се подобри диагностиката на компилатора и програмистите да могат да дават указания какви типове очакват. Модули Все още в много ранна фаза Работа с файлова система Базирана на boost::filesystem Работа с мрежи Базирана на boost::asio
  17. 17. C++ Core Guidelines 1. C++ CG са резултат на много човекогодини дискусии и дизайн. 2. Целта е с насоките да се помогне на хората ефективно да пишат модерен С++ код 3. https://github. com/isocpp/CppCoreGuideline s
  18. 18. Guideline Support Library 1. Съдържа типове, предложени за употреба от C++ CG 2. Цялата имплементация е във хедъри 3. https://github. com/Microsoft/GSL
  19. 19. Типове в GSL span<T> Обвивка около n-мерен масив, която не участва в управлението на живота му. string_span<T> Обвивка около char*, std::string и др. представяща текст. Има интерфейс много близък до този на std::string not_null<T> Гарантира, че винаги държи указател от тип T, който не е nullptr owner<T> template <class T> using owner = T;
  20. 20. Типове в GSL finally() Създава обект, който в деструктора си извиква подадена функция или обект с дефиниран operator() ... auto clean_up = finally( [handle]() { close(handle); } ); ...
  21. 21. Въпроси

×