c++ openfest 2015

21
C++ на стероиди Николай Николов • 08.11.2015

Upload: nikolay-nikolov

Post on 11-Feb-2017

636 views

Category:

Self Improvement


1 download

TRANSCRIPT

C++на стероиди

Николай Николов • 08.11.2015

“Programming is thinking, not typing.”Casey Patton

2002

Започва работата по C++0x

2003

“Бъг фикс” на ISO C++Няма промяна в езика от

гледна точка на програмиста

2011

Публикуван е стандарта C++11

Множество промени в езика

2014

Публикуван е стандарта C++14

2015

Работа по C++17Приблизително 4,4 млн потребителя на езика

autoint func();auto f = func(); // f е int

std::vector<int> v;auto e = v.end(); // std::vector<int>>::iterator

Типът автоматично се извлича при инициализацията.

auto променлива не може да остане не инициализирана.

Type deduction (Effective Modern C++).

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

} }

ламбда изразиint var;

auto lam = [&var]( int param ) -> bool {

return var == param;}

if( lam(5) ) {…

}

Конструира безименен функционален обект, който може да прихваща променливи.

Особено удобни за употреба заедно с функциите, предоставени от <algorithm>.

Могат да се използват като слотове в Qt5.

C++14 добавя генерализирани ламбда изрази и възможност за изрази при прихващенето.

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;};

Показва, че променливата или функцията може да се използва в константен израз.

Константните изрази се изпълняват по време на компилация.

user-defined literals

constexpr uint64_t operator"" _KB ( unsigned long long int val ){ return val * 1024;}

uint64_t data_size = 2_KB;

Позволява целочислени, с плаваща запетая или текстови литерали да създават потребителки дефинирани типове.

В С++14 STL предоставя готови литерали за основни типове данни.

псевдоними// typedef std::ios_base::fmtflags flags;using flags = std::ios_base::fmtflags;

// typedef void (*func)(int, int);using func = void (*) (int,int);

// template type aliastemplate<class T> using ptr = T*;

// името 'ptr<T>' вече е псевдоним на указател към типа Tptr<int> x;

● Типови псевдоними - подобни на typedef

● Шаблонни псевдоними

move семантика

class_name ( class_name && ) {...

}

class_name & class_name::operator= ( class_name && ) {

...}

● move конструктор● move оператор за присвояване● std::move● Return value optimization (RVO)

std::movevoid 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 вече е празен, може променливата да се преизползва

Return value optimization (RVO)class Thing {public:

Thing(); ~Thing(); Thing(const Thing&);};

Thing f() { Thing t; return t;}

умни указатели● std::unique_ptr● std::shared_ptr● std::weak_ptr

Пример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;}

variadic templates

Позволяват създаването на темплейти с променлив брой параметри.

Очаквания за C++17

ConceptsЦелта е да се подобри диагностиката на компилатора и програмистите да могат да дават указания какви типове очакват.

МодулиВсе още в много ранна фаза

Работа с файлова системаБазирана на boost::filesystem

Работа с мрежиБазирана на boost::asio

C++ Core Guidelines

1. C++ CG са резултат на много човекогодини дискусии и дизайн.

2. Целта е с насоките да се помогне на хората ефективно да пишат модерен С++ код

3. https://github.com/isocpp/CppCoreGuidelines

Guideline Support Library

1. Съдържа типове, предложени за употреба от C++ CG

2. Цялата имплементация е във хедъри

3. https://github.com/Microsoft/GSL

Типове в 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;

Типове в GSL

finally()Създава обект, който в деструктора си извиква подадена функция или обект с дефиниран operator()

...auto clean_up = finally( [handle]() { close(handle); } );...

Въпроси