You are on page 1of 56

PB161 -- C++11 Standard -- 9. 12.

2013

Osnova
Podpora nap pekladai Klov slova Konstrukce jazyka STL Knihovna Bonus

znaen
detail technick detail, pro zajmavost navc nebudeme probrat dopodrobna
PB161 -- C++11 Standard -- 9. 12. 2013 2

Motivace

Pro roziovat C++?


nov postupy
chybjc funkcionalita v jazyku snaha aplikovat trendy vci jazyky jako C# a Java je ji implementuj

Z toho plyne roziovn


jazyka

standardn knihovny

PB161 -- C++11 Standard -- 9. 12. 2013

Pekladae

GCC
verze 4.7.2 nebo 4.7.3 tm cel standard
verze 4.8.1 ve (pouze ohleno)

clang
verze 3.2 nebo 3.3 tm ve

MSVC
verze 2012 nedostatky v jazyku verze 2013 tm ve

PB161 -- C++11 Standard -- 9. 12. 2013

Klov slova
nov pidan (decltype, constexpr, ) zmna vznamu (auto) rozen vznamu (using, delete, ) nov pidan v kontextu (final, override)

PB161 -- C++11 Standard -- 9. 12. 2013

Klov slova auto

problm 1:
pouijete ve sv td std::vector
ten je parametrizovn ablonovm typem

een v C++03 (pouvan v PB161)


typename std::vector< Type >::iterator it;

nepehledn, sloit nutnost pepsat typ Type pi zmn typu

PB161 -- C++11 Standard -- 9. 12. 2013

Klov slova auto

problm 2
mte ablonovanou funkci
nad ablonovm parametrem volte metodu neznte datov typ vsledku voln me se netriviln mnit

een v C++03
pout typedef ze ablonov tdy
typename Type::return_t ret = t.call();

nepehledn, sloit

PB161 -- C++11 Standard -- 9. 12. 2013

Klov slova auto


oznauje odvoditeln typ promnnch pouvat s rozvahou

double foo() { return 3.14; } int main() { auto a = 0;// int std::vector< long > v; auto i = v.begin();// std::vector< long >::iterator auto pi = foo();// double return 0; }

PB161 -- C++11 Standard -- 9. 12. 2013

Klov slova char*_t


nov typy char16_t pro UTF-16 znaky char32_t pro UTF-32 znaky

PB161 -- C++11 Standard -- 9. 12. 2013

Klov slova constexpr


zna, e vraz je konstantn a lze vypotat v dob pekladu lze pout na promnn, funkce a metody

constexpr int factorial( int f ) { return f <= 1 ? 1 : f * factorial( f-1 ); } template< int N > void testPrint() { std::cout << N << std::endl; } testPrint< factorial( 4 ) >();// 4! == 24
PB161 -- C++11 Standard -- 9. 12. 2013 10

Klov slova decltype


decltype( vraz ) stv se typem, kter vznikne vyhodnocenm vrazu pouit v situacch, kdy nen mon zjistit typ vrazu vysvtlen pouit pozdji

double pi = 3.14; decltype( pi ) alsoDouble = 4; decltype( 0 ) IamInt = 10;

PB161 -- C++11 Standard -- 9. 12. 2013

11

Klov slova default, delete


lze poznait konstruktory a piazovac opertor default vynut vygenerovn pekladaem

pozor na reference

delete zake voln


v C++03 eeno umstnm do private sekce
neintuitivn
class MyClass { public: MyClass() = default; MyClass( const MyClass &) = delete; MyClass operator=(MyClass) = delete; };
PB161 -- C++11 Standard -- 9. 12. 2013 12

Klov slova final, override

problm
v C++03 nen mon ovit, zda pekrvme

virtuln metodu, nebo ne


klasifiktor const, volatile

pepsn v psmenu
viditelnost

pitom snadn odhalit pekladaem Java i C# kontrolu maj

PB161 -- C++11 Standard -- 9. 12. 2013

13

Klov slova final, override


klov slova pouze na sprvnm mst


zvis na kontextu pouit

takto poznaen virtuln metody peklada zkontroluje metoda poznaen jako final nesm bt pekryta metoda poznaen jako override mus pekrvat metodu z ddn tdy
struct A { virtual void foo() {} }; struct B : A { virtual void foo() override {} }; struct C : B { virtual void foo() final override {}; }
//struct D : C { virtual void foo() {}; } error

PB161 -- C++11 Standard -- 9. 12. 2013

14

Klov slova noexcept


nhrada za throw v hlavikch funkc/metod noexcept jako opertor

Detekuje, zda je vraz oznaen jako noexcept

noexcept jako specifiktor


Oznauje funkce/metody a pomh

programtorovi urit, zda me oekvat vjimku, nebo ne


void foo( const T &t ) noexcept( noexcept( t = t ) ) { t = t; specifiktor opertor }
PB161 -- C++11 Standard -- 9. 12. 2013 15

Klov slova nullptr


nulov pointer, nhrada za NULL typov bezpen

NULL je typu int problm pi petovn, aplikaci ablonovch parametr nullptr m nedefinovan typ (zle na

pekladai), ovem je pln konvertibiln pouze na ukazatele

NULL nebylo odstranno z dvodu zptn kompatibility


PB161 -- C++11 Standard -- 9. 12. 2013 16

Klov slova static_assert


static_assert( vraz, chybov hlka ); pi pekladu dojde k vyhodnocen vrazu pokud se hodnota vrazu rovn false, dojde k zobrazen chybov hlky a ukonen kompilace vyuit kontrola ablonovch parametr kontrola constexpr vraz

static_assert( sizeof( bool ) > 1, "bool is bigger than one byte" );

PB161 -- C++11 Standard -- 9. 12. 2013

17

Klov slova using


rozen vznamu umon definovat vlastn typy podobn jako typedef, ale lep

um pracovat se ablonami v C++03 bylo nutn udlat wrapper


using uint = unsigned int;
template< typename T > using Matrix = std::vector< std::vector< T > >; Matrix< int > matrix;
PB161 -- C++11 Standard -- 9. 12. 2013 18

Konstrukce jazyka
R-value reference variadick ablony range-for cyklus inicializan seznam nov zpis funkce lambda

PB161 -- C++11 Standard -- 9. 12. 2013

19

Konstrukce jazyka R-value reference motivace (+ opakovn)


std::string foo() { return "mooooc dlouuuuuhyyyy teeeeext"; } std::string text = foo() + foo();

dojde k vytvoen doasnho etzce (2x) 2. dojde ke spojen doasnch etzc 3. zavol se koprovac konstruktor 4. etzec se zkopruje 5. doasn etzec se zahod
1.

PB161 -- C++11 Standard -- 9. 12. 2013

20

Konstrukce jazyka R-value reference pipomenut

L-hodnota
to, co me bt na lev stran piazen
promnn, reference, bitfield,

dereferencovan ukazatel

R-hodnota
to ostatn doasn objekty, sla, etzce,

PB161 -- C++11 Standard -- 9. 12. 2013

21

Konstrukce jazyka R-value reference

vkonnostn optimalizace
reference na doasn objekt

doasn objekt kon platnost lze

vykrst

pmo se potkte vjimen


vnitn pouvaj STL kontejnery

pouit oklikou
funkce std::move pesune (nejen) STL

kontejner z pvodn promnn do nov


PB161 -- C++11 Standard -- 9. 12. 2013 22

Konstrukce jazyka R-value reference pklad pouit


std::vector< std::string > texts; std::string t( "dloooooouuuuuhyyyyyy teeeeext" );
// nevola se kopirovaci konstruktor // presunuti textu muze mit vyrazny vliv // na rychlost aplikace

texts.push_back( std::move( t ) );
// t je v tomto okamziku prazdne // a jiz by se nemelo pouzivat

std::string tt( "dloooooouuuuuhyyyyyy teeeeext" ); std::string o1 = tt;// kopirovaci konstruktor std::string o2 = std::move( tt );// presouvaci konstruktor
// funkce s parametrem vynucujicim presunuti

void foo( std::string &&text ) { ... } foo( std::move( o1 ) );


//foo( o2 ); chyba

R-value reference se zapisuje jako &&


23

PB161 -- C++11 Standard -- 9. 12. 2013

Konstrukce jazyka variadick ablony

problm
chci volat funkci/metodu s neomezen

mnoho parametry
printf

een v C++03:
nen nutnost pouit extern C problm s typovou kontrolou

een v C++11:
variadick ablony
PB161 -- C++11 Standard -- 9. 12. 2013 24

Konstrukce jazyka variadick ablony


template< typename T > class Adapter { int _id; T _obj; public: template< typename... Args > Adapter( int id, Args &&... args ) : _id( id ), _obj( std::forward< Args >( args )... ) {} };

Vzorov peposln vech parametr do konstruktoru objektu typu T.


PB161 -- C++11 Standard -- 9. 12. 2013 25

Konstrukce jazyka variadick ablony

ve standardn knihovn mnoho vyuit


std::make_shared
std::thread std::make_tuple
vytvo anonymn strukturu

VS2012 een
ablonov parametry a do cca 20 parametr

PB161 -- C++11 Standard -- 9. 12. 2013

26

Konstrukce jazyka range-for cyklus

Pro dal druh cyklu?


asto se prochz datov kontejnery
iterovn pes index nelze pout u vech (a

navc je pomalej) prochzen pomoc itertor m krkolomn zpis std::for_each nem nic jako pkaz break v cyklech
eit pomoc vyhazovn vjimky je kared

PB161 -- C++11 Standard -- 9. 12. 2013

27

Konstrukce jazyka range-for cyklus


std::vector< std::string > names; for ( const std::string &name : names ) { } for ( int i : { 1, 2, 3, 4, 5, 6 } ) { for ( expr : container ) body }

{ auto &&__c = container; auto __i = beginExpr, __e = endExpr; for ( ;__i != __e; ++__i ) { expr = *__i; body } }
PB161 -- C++11 Standard -- 9. 12. 2013 28

Konstrukce jazyka range-for cyklus

chci pout i pro vlastn tdu


metoda begin
metoda end implementace itertoru

PB161 -- C++11 Standard -- 9. 12. 2013

29

Konstrukce jazyka inicializan seznam

monost inicializovat tdu pomoc vce prvk


typicky u kontejner z STL

std::vector< int > primes{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 };

v souvislosti s tm dolo k monosti pout syntaxi sloench zvorek i k voln bnch konstruktor
lze tak explicitn volat bezparametrick

konstruktory elementrnch typ


int, char, double,

PB161 -- C++11 Standard -- 9. 12. 2013

30

Konstrukce jazyka inicializan seznam

realizace
std::initializer_list< type >
chov se jako datov kontejner metody begin, end, size

chci pout ve vlastn td


implementovat konstruktor implementovat piazovac opertor

brt hodnotou nemus bt datovm kontejnerem v pamti

PB161 -- C++11 Standard -- 9. 12. 2013

31

Konstrukce jazyka inicializan seznam


class MyClass { std::vector< int > d[2]; public: MyClass( std::initializer_list< int > list ) { int index = 0; for ( int i : list ) { d[index].push_back( i ); index = (index + 1) % 2; } } }; MyClass c{ 1, 2, 3, 4, 5, 6 };

PB161 -- C++11 Standard -- 9. 12. 2013

32

Konstrukce jazyka nov zpis funkce


return_type name( parametres ) { body } auto name( parametres ) -> return_type { body }

vhody? viditelnost jmen parametr pi definici nvratov hodnoty template< typename T, typename U > auto foo( T &t, U &u ) -> decltype( t + u ) lep pehlednost {

komplikovan typ za ipku snadn standardn


t.Prepare(); u.Prepare(); return t + u;
}

PB161 -- C++11 Standard -- 9. 12. 2013

33

Konstrukce jazyka nov zpis funkce


template< bool, bool > struct Or : std::true_type {}; template<> struct Or< false, false > : std::false_type {}; template< typename T > struct IsDefined : std::is_same< T, T > {}; struct OwnInteger { OwnInteger operator-() { return *this; } }; std::ostream &operator<<(std::ostream &out, OwnInteger i) { out << "OwnInteger works"; return out; } template< typename T > auto foo( T t ) -> typename std::enable_if< Or< std::is_integral< T >::value, IsDefined< decltype(-t) >::value >::value, decltype(-t) >::type { return -t; }

PB161 -- C++11 Standard -- 9. 12. 2013

34

Konstrukce jazyka lambda

situace
pouvme algoritmy z STL
mnoh z nich potebuj funktor jako parametr funktor = vytvoit tdu

problm
kostrbat syntaxe nutnost vymlet nzvy vc funktor ztrta pehlednosti kdu

PB161 -- C++11 Standard -- 9. 12. 2013

35

Konstrukce jazyka lambda

znm z funkcionlnho paradigmatu


anonymn funkce
m schopnost zachytvat svj kontext me vidt na promnn okolo sebe capture sekce

syntaxe:
[ capture ] ( parametres ) -> return_t { body }

nkter sti definice mohou bt vynechny


PB161 -- C++11 Standard -- 9. 12. 2013 36

Konstrukce jazyka lambda

capture
monost zachycen promnnch okolo lambdy

[] nezachytv kontext (normln funkce) [=] zachyt ve hodnotou (konstantn)

[&] zachyt ve referenc (teoreticky)


[a,&b] zachycen a hodnotou, b referenc
std::vector< int > v{ 1, 2, 3, 4, 5, 6, 42 }; int numberOfEven{};// inicializace defaultnim ctorem, = 0 std::for_each( v.begin(), v.end(), [&] ( int n ) { if ( n % 2 == 0 ) ++numberOfEven; } );
PB161 -- C++11 Standard -- 9. 12. 2013 37

Konstrukce jazyka lambda

jak m typ?
pokud nechyt kontext, je typem funkce
pokud zachytv kontext, nen mon vdt typ tda generovan pekladaem

jak lze uloit?


do promnn typu auto do ablonov promnn

do promnn typu std::function<signature>

PB161 -- C++11 Standard -- 9. 12. 2013

38

Konstrukce jazyka lambda


#include <functional> #include <iostream> template< typename C, typename A > void foo( C callback, A argument ) { callback( argument ); } int main() { int context = 0; auto lambda1 = [&] ( int n ) -> int { ++context; return n*n; } std::function< void(int) > lambda2 = [&] ( int n ) { context += n; } lambda1(42); lambda2(42); foo( lambda1, 5 ); foo( [] ( int n ) { std::cout << n << std::endl; }, 2 ); return 0; }

PB161 -- C++11 Standard -- 9. 12. 2013

39

STL Knihovna
statick pole automatick pointry vlkna

mutex

regulrn vrazy anonymn struktury (a mnoh dal)

PB161 -- C++11 Standard -- 9. 12. 2013

40

STL Knihovna statick pole

problm
chci zvtovac pole pouiji std::vector chci nezvtovac statick pole musm pout pole z jazyka C

een C++11
std::array< typ, velikost > chov se jako pole m metody jako kontejner
begin, end, size, operator[]

PB161 -- C++11 Standard -- 9. 12. 2013

41

STL Knihovna statick pole


#include <array> #include <iostream> #include <string> int main() { std::array< int, 3 > intArray{ { 1,2,3 } };
// except after = // double-braces required

std::array< std::string, 3 > textArray = { "text", "texz2", "text3" }; for ( const auto &t : textArray ) std::cout << t << std::endl; std::cout << intArray.size() << std::endl; return 0; }

PB161 -- C++11 Standard -- 9. 12. 2013

42

STL Knihovna automatick pointry

problm
v C a C++ je poteba alokovanou pam

uvolovat je poteba podchytit vechna mon situace, kdy je poteba dealokovat

een C++
princip RAII dynamicky alokovan zdroje spravuje tda v destruktoru tda dealokuje zdroje

PB161 -- C++11 Standard -- 9. 12. 2013

43

STL Knihovna automatick pointry

std::unique_ptr< typ >


symbolizuje uniktnost dynamick pamti
lze pouze pesouvat std::move

std::shared_ptr< typ >


symbolizuje vlastnictv dynamick pamti
pot si reference, posledn dealokuje

std::weak_ptr< typ >


symbolizuje bn ukazatel ped pouitm nutn konvertovat na std::shared_ptr

PB161 -- C++11 Standard -- 9. 12. 2013

44

STL Knihovna automatick pointry


#include <iostream> #include <memory> std::weak_ptr<int> gw; void f() {
// Has to be copied into a shared_ptr before usage

if (auto spt = gw.lock()) std::cout << *spt << "\n"; else std::cout << "gw is expired\n"; } void main() { { auto sp = std::make_shared<int>(42); gw = sp; f();// 42 } f();// gw is expired }

Variadick ablona funkce. Bere pesn takov argumenty, jak potebuje konstruktor alokovanho objektu.
45

PB161 -- C++11 Standard -- 9. 12. 2013

STL Knihovna vlkna


C a C++03 neznalo nic jako pojem vlkno v C++11 je pojem vlkno zaveden

C# a Java ho maj zaveden ji dlouho operan systmy umouj pracovat s vlkny problm s rozdlnm API pthread API nefunguje vude standardizovno rozhran

PB161 -- C++11 Standard -- 9. 12. 2013

46

STL Knihovna vlkna


#include <iostream> #include <thread> #include <vector> void foo( int i ) { std::cout << "Hello world from thread " << i << std::endl; }

void main() { std::vector< std::thread > threads( 12 ); int i{}; for ( auto &t : threads ) { t = std::thread( foo, i++ ); } Variadick ablona konstruktoru. for ( auto &t : threads ) { t.join();// wait for thread t Bere pesn takov argumenty, jak potebuje opertor voln } spoutnho objektu/funkce. }
PB161 -- C++11 Standard -- 9. 12. 2013 47

STL Knihovna synchronizan primitiva

problm
vpis nebude atomick me se stt (a stvat se bude), e budou proloen elementrn jednotky vstupu mezi vlkny

een
pout kritickou sekci st kdu, kde je zaruen, e bude provdt pouze jedno vlkno souasn

PB161 -- C++11 Standard -- 9. 12. 2013

48

STL Knihovna synchronizan primitiva


#include #include #include #include <iostream> <thread> <vector> <mutex> int main() { std::vector< std::thread > threads( 12 ); std::mutex mutex; int i{}; for ( auto &t : threads ) { t = std::thread( [&]( int i ) { std::lock_guard< std::mutex > lock( mutex ); std::cout << "Hello world from " << i << std::endl; }, i++ ); } for ( auto &t : threads ) t.join(); return 0; }

PB161 -- C++11 Standard -- 9. 12. 2013

49

STL Knihovna regulrn vrazy


znm z dalch jazyk


C#, Java, Perl, PHP, Javascript,

problm
validace emailov adresy

C++03
nutn volat systmov knihovny

C++11
soust STL knihovny pozor, nefunguje v libstdc++ (gcc)
pedpokld se, e bude korektn implementovno s

verz GCC 4.9.0

PB161 -- C++11 Standard -- 9. 12. 2013

50

STL Knihovna regulrn vrazy


#include <iostream> #include <string> #include <regex> int main() { std::string filenames[] = {"foo.txt", "bar.txt", "baz.dat", "zoidberg"}; std::regex txt_regex("([a-z]+)\\.txt"); std::smatch match; for (const auto &name : filenames) { if (std::regex_match(name, match, txt_regex)) {
// The first sub_match is the whole string; the next // sub_match is the first parenthesized expression.

if (base_match.size() == 2) { std::ssub_match base_sub_match = base_match[1]; std::string base = base_sub_match.str(); std::cout << name << " has a base of " << base << std::endl; } } } }

PB161 -- C++11 Standard -- 9. 12. 2013

51

STL Knihovna anonymn struktury


problm
poteba vrtit z funkce vc hodnot

C++03
pro dv hodnoty lze pout
std::pair< T1, T2 >

vc hodnot poteba vytvoit tdu/strukturu

C++11
std::tuple

PB161 -- C++11 Standard -- 9. 12. 2013

52

STL Knihovna anonymn struktury


#include <iostream> #include <string> #include <tuple>

Variadick ablona tdy.

std::tuple< int, std::string, double > foo() { return std::make_tuple( 0, std::string( "text" ), 3.14 ); } int main() { Variadick ablona auto result = foo(); std::get< 1 >( result ) += "ik"; std::cout << std::get< 0 >( result ) << std::endl;// 0 std::cout << std::get< 1 >( result ) << std::endl;// textik std::cout << std::get< 2 >( result ) << std::endl;// 3.14 int intValue; std::string strValue; double dValue; std::tie( intValue, strValue, dValue ) = foo(); std:: cout << intValue << " " << strValue << " " << dValue << std::endl;
// 0 text 3.14

funkce

}
PB161 -- C++11 Standard -- 9. 12. 2013 53

Rule of three (+half)

Pokud chcete implementovat jednu z tchto metod, pravdpodobn chcete implementovat vechny
koprovac konstruktor

piazovac opertor
destruktor (swap metodu + peten std::swap)

PB161 -- C++11 Standard -- 9. 12. 2013

54

Rule of four (+half)

V C++11 je vhodn rozit seznam na


koprovac konstruktor
move konstruktor
MyClass( MyClass &&m );

piazovac opertor
destruktor (swap metodu + peten std::swap)

PB161 -- C++11 Standard -- 9. 12. 2013

55

Copy & swap idiom

Implementace opertoru piazen


Problm! je nutn zaruit, e objekty budou v konzistentnch stavech een (rule of three / four)
MyClass &operator=( MyClass m ) { swap( m ); return *this; } Parametr brt hodnotou

swap nesm vyhodit vjimku elegantn a efektivn een

PB161 -- C++11 Standard -- 9. 12. 2013

56

You might also like