64
C++17 C++17 El lenguaje que sustituirá a C++11/14 J. Daniel Garcia Grupo ARCOS Universidad Carlos III de Madrid 19 de noviembre de 2016 cbed J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 1/51

C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

C++17El lenguaje que sustituirá a C++11/14

J. Daniel Garcia

Grupo ARCOSUniversidad Carlos III de Madrid

19 de noviembre de 2016

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 1/51

Page 2: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Aviso

c Esta obra está bajo una Licencia Creative CommonsAtribución-NoComercial-SinDerivar 4.0 Internacional.

b Debes dar crédito en la obra en la forma especificadapor el autor o licenciante.

e El licenciante permite copiar, distribuir y comunicar pú-blicamente la obra. A cambio, esta obra no puede serutilizada con fines comerciales — a menos que se ob-tenga el permiso expreso del licenciante.

d El licenciante permite copiar, distribuir, transmitir y co-municar públicamente solamente copias inalteradas dela obra – no obras derivadas basadas en ella.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 2/51

Page 3: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

ARCOS@uc3m

UC3M: Una universidad joven, internacional y orientada ala investigación.ARCOS: Un grupo de investigación aplicada.

Líneas: Computación de altas prestaciones, Big data,Sistemas Ciberfísicos, y Modelos de programación para lamejora de las aplicaciones

Mejorando las aplicaciones:REPARA: Reengineering and Enabling Performance andpoweR of Applications. Financiado por Comisión Europea(FP7).RePhrase: REfactoring Parallel Heterogeneous ResourceAware Applications. Financiado por Comisión Europea(H2020).

Normalización:ISO/IEC JTC/SC22/WG21. Comité ISO C++.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 3/51

Page 4: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

¿Te interesa C++?

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 4/51

Page 5: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

C++

1 C++

2 Lenguaje

3 Biblioteca estándar

4 El futuro de C++

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 5/51

Page 6: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

C++

C++ en dos líneas

Correspondencia directa con el hardware.Instrucciones y tipos de datos fundamentales.Inicialmente heredado de C.Presente y futuro: usar mejor el hardware.

caches, multicores, GPUs, FPGAs, SIMD, . . .

Abstracciones sin sobrecarga (zero-overhead).Clases, herencia, programación genérica, . . .Tomado de Simula-67 (que si tenía sobrecarga).Futuro: Seguridad de tipos y recursos, conceptos, módulos,concurrencia, contratos, . . .

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 6/51

Page 7: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

C++

C++ en dos líneas

Correspondencia directa con el hardware.Instrucciones y tipos de datos fundamentales.Inicialmente heredado de C.Presente y futuro: usar mejor el hardware.

caches, multicores, GPUs, FPGAs, SIMD, . . .

Abstracciones sin sobrecarga (zero-overhead).Clases, herencia, programación genérica, . . .Tomado de Simula-67 (que si tenía sobrecarga).Futuro: Seguridad de tipos y recursos, conceptos, módulos,concurrencia, contratos, . . .

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 6/51

Page 8: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

C++

Evolución

C++11 for una mejora radicalC++14 completó C++11.C++17 añade muchas mejoras menores.C++20 podría ser la siguiente major release.

Muchas características nuevas.Concurrencia, números aleatorios, expresiones regulares,. . .Lambdas, expresiones constantes generalizadas, . . .

Simplificación de uso:Auto, bucles basados en rango, iniciación uniforme,semántica de movimiento, . . .

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 7/51

Page 9: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

C++

Evolución

C++11 for una mejora radicalC++14 completó C++11.C++17 añade muchas mejoras menores.C++20 podría ser la siguiente major release.

Muchas características nuevas.Concurrencia, números aleatorios, expresiones regulares,. . .Lambdas, expresiones constantes generalizadas, . . .

Simplificación de uso:Auto, bucles basados en rango, iniciación uniforme,semántica de movimiento, . . .

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 7/51

Page 10: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

C++

Evolución

C++11 for una mejora radicalC++14 completó C++11.C++17 añade muchas mejoras menores.C++20 podría ser la siguiente major release.

Muchas características nuevas.Concurrencia, números aleatorios, expresiones regulares,. . .Lambdas, expresiones constantes generalizadas, . . .

Simplificación de uso:Auto, bucles basados en rango, iniciación uniforme,semántica de movimiento, . . .

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 7/51

Page 11: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

C++

El comité C++

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 8/51

Page 12: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

C++

El comité ISO C++

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 9/51

Page 13: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

C++

C++14

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 10/51

Page 14: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

C++

Tres reuniones al año

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 11/51

Page 15: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

C++

C++ timeline

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 12/51

Page 16: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

1 C++

2 Lenguaje

3 Biblioteca estándar

4 El futuro de C++

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 13/51

Page 17: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Selección en tiempo de compilación

2 LenguajeSelección en tiempo de compilaciónIniciación sentencias condicionalesDeducción de plantilla en constructorVariables inlineDeclaraciones de descomposición

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 14/51

Page 18: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Selección en tiempo de compilación

Selección en tiempo de compilación

Se introduce un nuevo tipo de selección que se evalúa entiempo de compilación.

// ...if constexpr (expresion) {}

Útil especialmente en contextos de programacióngenérica.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 15/51

Page 19: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Selección en tiempo de compilación

Problemas con plantillas variádicas

C++11/14

template <class T>void f (T&& t){

print ( t ) ;}

template <class T, class... Rest>void f (T&& t, Rest&&... r ){

f ( t ) ;f ( r ...) ; // Bug overload f()

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 16/51

Page 20: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Selección en tiempo de compilación

Simplificación plantillas variádicas

C++17

template <class T, class... Rest>void f (T&& t, Rest&&... r ){

print ( t ) ;if constexpr (sizeof(r ...) >0) {

f ( r ...) ;}

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 17/51

Page 21: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Selección en tiempo de compilación

Selección entre familias de tipos

C++17

template <class T>void f (T x){

if constexpr (std:: is_integral <T>::value) {implA(x);

}else if constexpr (std:: floating_point <T>::value) {

implB(x);}else {

implC(x);}

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 18/51

Page 22: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Iniciación sentencias condicionales

2 LenguajeSelección en tiempo de compilaciónIniciación sentencias condicionalesDeducción de plantilla en constructorVariables inlineDeclaraciones de descomposición

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 19/51

Page 23: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Iniciación sentencias condicionales

Problema

Muchas veces hace falta definir una variable solamentepara usarla en una selección (if/switch) y no se vuelve ausar.

Los bucles for permiten definir la variable en la propiasentencia.Extensión natural.

C++11/14

int codigo = obten_codigo();if (codigo != 0) {

procesa(codigo);}// variable en alcance

C++17

if ( int codigo = obten_codigo(); codigo != 0) {procesa(codigo);

}// variable fuera de alcance

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 20/51

Page 24: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Iniciación sentencias condicionales

Problema

Muchas veces hace falta definir una variable solamentepara usarla en una selección (if/switch) y no se vuelve ausar.

Los bucles for permiten definir la variable en la propiasentencia.Extensión natural.

C++11/14

int codigo = obten_codigo();if (codigo != 0) {

procesa(codigo);}// variable en alcance

C++17

if ( int codigo = obten_codigo(); codigo != 0) {procesa(codigo);

}// variable fuera de alcance

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 20/51

Page 25: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Iniciación sentencias condicionales

Problema

Muchas veces hace falta definir una variable solamentepara usarla en una selección (if/switch) y no se vuelve ausar.

Los bucles for permiten definir la variable en la propiasentencia.Extensión natural.

C++11/14

int codigo = obten_codigo();if (codigo != 0) {

procesa(codigo);}// variable en alcance

C++17

if ( int codigo = obten_codigo(); codigo != 0) {procesa(codigo);

}// variable fuera de alcance

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 20/51

Page 26: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Iniciación sentencias condicionales

Inserción en un map

C++11/14

{ auto p = m.try_emplace(key, value);if (! p.second) {

FATAL("Element already registered");}else {

process(p.second);} }

C++17

if (auto p = m.try_emplace(key, value); !p.second) {FATAL("Element already registered");

}else {

process(p.second);}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 21/51

Page 27: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Iniciación sentencias condicionales

Inserción segura

C++11/14

void safe_insert(vector<int> & v, int x) {std :: lock_guard<std::mutex> l{mut};if (v.empty()) {

v.push_back(x);}

}

C++17

void safe_insert(vector<int> & v, int x) {if (std :: lock_guard<std::mutex> l{mut}; v.empty()) {

v.push_back(x);}

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 22/51

Page 28: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Iniciación sentencias condicionales

switch con iniciación

C++11/14

elemento e = obten_elemento();switch (auto s = e.estado()) {

case activo: e.envia_mensaje(); break;case inactivo: e.encola_mensaje(); break;default: throw error {};

}

C++17

switch (elemento e = obten_elemento(); auto s = e.estado()) {case activo: e.envia_mensaje(); break;case inactivo: e.encola_mensaje(); break;default: throw error {};

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 23/51

Page 29: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Deducción de plantilla en constructor

2 LenguajeSelección en tiempo de compilaciónIniciación sentencias condicionalesDeducción de plantilla en constructorVariables inlineDeclaraciones de descomposición

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 24/51

Page 30: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Deducción de plantilla en constructor

Argumentos de plantilla en constructor

La deducción de argumentos de plantilla en C++11/14actúa sobre funciones pero no sobre clases.

Se extiende las reglas de deducción a constructores.

std :: pair<int,std :: string> p{2, "hola"s }; // C++11auto q = std :: make_pair(2, "hola"s); // C++11

pair r {2, "hola"s }; // C++17

std :: mutex mstd :: lock_guard<std::mutex> l{m}; // C++11

std :: lock_guard l{m}; // C++17

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 25/51

Page 31: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Deducción de plantilla en constructor

Argumentos de plantilla en constructor

La deducción de argumentos de plantilla en C++11/14actúa sobre funciones pero no sobre clases.

Se extiende las reglas de deducción a constructores.

std :: pair<int,std :: string> p{2, "hola"s }; // C++11auto q = std :: make_pair(2, "hola"s); // C++11

pair r {2, "hola"s }; // C++17

std :: mutex mstd :: lock_guard<std::mutex> l{m}; // C++11

std :: lock_guard l{m}; // C++17

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 25/51

Page 32: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Variables inline

2 LenguajeSelección en tiempo de compilaciónIniciación sentencias condicionalesDeducción de plantilla en constructorVariables inlineDeclaraciones de descomposición

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 26/51

Page 33: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Variables inline

Variables inline

Una variable marcada como inline:Puede aparecer en varias unidades de traducción si tienela misma definición.

Puedes poner la definición en un archivo de cabecera.

Debe estar definida en cada unidad de traducción en la quese usa.Hay una única instancia.

Los datos miembro que sean constexpr y static sonimplícitamente inline.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 27/51

Page 34: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Variables inline

Constantes en C++14

tabla.h

static constexpr numelem = 100;

class tabla {// ...

private:static constexpr max = 10;// ...

};

tabla.cpp

static constexpr numelem;static constexpr tabla::max;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 28/51

Page 35: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Variables inline

Constantes en C++17

tabla.h

inline static constexpr numelem = 100;

class tabla {// ...

private:static constexpr max = 10;// ...

};

Sin definición.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 29/51

Page 36: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Declaraciones de descomposición

2 LenguajeSelección en tiempo de compilaciónIniciación sentencias condicionalesDeducción de plantilla en constructorVariables inlineDeclaraciones de descomposición

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 30/51

Page 37: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Declaraciones de descomposición

Devolución múltiple en C++14

En C++14 es posible devolver múltiples valores de unafunción usando una tupla.

Retorno múltiple

std :: tuple<int,std :: string ,double> f() {int x = obten_indice();std :: string n = obten_nombre();double y = obten_coste();return make_tuple(x,n,y);

}

void g() {auto z = f () ; // z es std :: tuple<int , string ,double>int a = get<0>(z);double c = get<2>(z);// ...

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 31/51

Page 38: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Declaraciones de descomposición

Devolución múltiple en C++14

También se puede devolver directamente sobre lasvariables.

Retorno múltiple

std :: tuple<int,std :: string ,double> f() {int x = obten_indice();std :: string n = obten_nombre();double y = obten_coste();return make_tuple(x,n,y);

}

void g() {int a;std :: string b;double c;std :: tie (a, b, c) = f () ;// ...

}cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 32/51

Page 39: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Declaraciones de descomposición

Descomposiciones en C++17

También se puede devolver directamente sobre lasvariables.

Retorno múltiple

std :: tuple<int,std :: string ,double> f() {int x = obten_indice();std :: string n = obten_nombre();double y = obten_coste();return make_tuple(x,n,y);

}

void g() {auto [a, b, c] = f () ;// ...

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 33/51

Page 40: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Declaraciones de descomposición

Descomposiciones y mapas

Simplicación de códigosde error.

C++17

map<int, std:: string> m;// ...auto [ i , exito ] = m.insert(pair (3, "Daniel")

;if ( exito ) usa(∗i) ;

Simplicación de bucles

C++17

map<int, std:: string> m;// ...for (const auto & [k,v] : m) {

cout << k << " −> " << v << endl;}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 34/51

Page 41: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Lenguaje

Declaraciones de descomposición

Descomposiciones y mapas

Simplicación de códigosde error.

C++17

map<int, std:: string> m;// ...auto [ i , exito ] = m.insert(pair (3, "Daniel")

;if ( exito ) usa(∗i) ;

Simplicación de bucles

C++17

map<int, std:: string> m;// ...for (const auto & [k,v] : m) {

cout << k << " −> " << v << endl;}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 34/51

Page 42: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Biblioteca estándar

1 C++

2 Lenguaje

3 Biblioteca estándar

4 El futuro de C++

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 35/51

Page 43: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Biblioteca estándar

Vistas sobre cadenas

3 Biblioteca estándarVistas sobre cadenasSistema de archivosAlgoritmos paralelosNuevos tipos de biblioteca

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 36/51

Page 44: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Biblioteca estándar

Vistas sobre cadenas

string_view

Define un objeto que se refiere a una secuencia decaracteres constante.

Tiene una interfaz muy similar a std::string.

std :: string_view sv1 = "hola";auto sv2 = "adios"sv;

std :: string s = "Daniel"std :: string_view sv3 = s;

std :: cout << sv3 << std::endl;

auto sv4 = "C++ mola";sv4 = sv4.substr(3) ;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 37/51

Page 45: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Biblioteca estándar

Sistema de archivos

3 Biblioteca estándarVistas sobre cadenasSistema de archivosAlgoritmos paralelosNuevos tipos de biblioteca

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 38/51

Page 46: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Biblioteca estándar

Sistema de archivos

Biblioteca fild_system

Ofrece una biblitoeca de manipulación del sistema dearchivos.

Algunas características:Representación de path.Iteradores de directorio (recursivos y no recursivos).Gestión de espacio de disco.Operaciones sobre ficheros y directorios.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 39/51

Page 47: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Biblioteca estándar

Sistema de archivos

Recorriendo un directorio

listdir.cpp

#include <fstream>#include <iostream>#include <filesystem>

int main(){

namespace fs = std::filesystem;

for(auto & f : fs :: directory_iterator {argv [1]}) {std :: cout << f << ’ \n’ ;

}}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 40/51

Page 48: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Biblioteca estándar

Algoritmos paralelos

3 Biblioteca estándarVistas sobre cadenasSistema de archivosAlgoritmos paralelosNuevos tipos de biblioteca

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 41/51

Page 49: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Biblioteca estándar

Algoritmos paralelos

Algoritmos paralelos

Se incluye una versión paralela de la mayoría de losalgoritmos de la STL.

Todos toman como parámetro la política de ejecución.Políticas: seq, par, par_unseq.

Ordenando un vector

vector<double> v = get_values();

sort (seq, begin(v), end(v));sort (par, begin(v), end(v));sort (par_unseq, begin(v), end(v));

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 42/51

Page 50: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Biblioteca estándar

Algoritmos paralelos

Operaciones de reducción generalizada

Permiten reducir usando un función binaria arbitraria.

Reduciendo un vector

vector<double> v = get_values();

auto suma = reduce(par, begin(v), end(v), 0,[]( auto x, auto y) { return x+y; }) ;

auto maximo = reduce(par, begin(v), end(v), 0,[]( auto x, auto y) { return std :: max(x,y); }) ;

auto sumacuadrados = transform_reduce(par, begin(v), end(v),[] (auto x) { return x∗x; }0,[] (auto x, auto y) { return x+y; }) ;

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 43/51

Page 51: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Biblioteca estándar

Nuevos tipos de biblioteca

3 Biblioteca estándarVistas sobre cadenasSistema de archivosAlgoritmos paralelosNuevos tipos de biblioteca

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 44/51

Page 52: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Biblioteca estándar

Nuevos tipos de biblioteca

Valores opcionales

Nuevo tipo optional para representar un valor que puedeestar o no presente.

Usando optional

std :: optional<elemento> obten_elemento(int id) {if (es_valido(id) ) return elemento{id};else return {};

}

void f ( int id ) {auto e = obten_elemento;if (e) cout << ∗e << endl;else cout << "vacio" << endl;

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 45/51

Page 53: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Biblioteca estándar

Nuevos tipos de biblioteca

Valores generalizados

Nuevo tipo any para representar un valor de cualquier tipo.

Es como un void* seguro en tipos.

Usando optional

void agrega_elemento(std::vector<std::any> & v, int id) {if (es_valido_A(id)) v.push_back(elemento{id});else if (es_valido_B(id)) v.push_back(compuesto{id});else v.push_back(derivado{id});

}

void imprime_elementos(const std::vector<std::any> & v) {for (auto & x : v) {

if (x.type() == typeid(elemento)) {std :: cout << x << std :: endl;

}}

}cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 46/51

Page 54: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

Biblioteca estándar

Nuevos tipos de biblioteca

Registros con variantes

Nuevo tipo variant valores de un número cerrado de tiposEs como un void* seguro en tipos.

Usando variant

void f () {std :: variant<int, std :: string , double> v;

v = 42;int x = get<int>(v);

try {auto d = get<double>(v);

}catch (std :: bad_variant_access&) {}

}

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 47/51

Page 55: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

El futuro de C++

1 C++

2 Lenguaje

3 Biblioteca estándar

4 El futuro de C++

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 48/51

Page 56: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

El futuro de C++

¿Qué puedo esperar?

Grandes novedades:

Módulos: ¡Acabemos con los includes!

Corrutinas: ¡Hagamos la asincronía sencilla!

Contratos: ¡Mejoremos la calidad de nuestro código!

Conceptos: ¡ Una mejor programación genérica!

Redes: ¡Programación portable del acceso a la red!

Rangos: ¡Una nueva biblioteca de contenedores!

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 49/51

Page 57: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

El futuro de C++

¿Qué puedo esperar?

Grandes novedades:

Módulos: ¡Acabemos con los includes!

Corrutinas: ¡Hagamos la asincronía sencilla!

Contratos: ¡Mejoremos la calidad de nuestro código!

Conceptos: ¡ Una mejor programación genérica!

Redes: ¡Programación portable del acceso a la red!

Rangos: ¡Una nueva biblioteca de contenedores!

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 49/51

Page 58: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

El futuro de C++

¿Qué puedo esperar?

Grandes novedades:

Módulos: ¡Acabemos con los includes!

Corrutinas: ¡Hagamos la asincronía sencilla!

Contratos: ¡Mejoremos la calidad de nuestro código!

Conceptos: ¡ Una mejor programación genérica!

Redes: ¡Programación portable del acceso a la red!

Rangos: ¡Una nueva biblioteca de contenedores!

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 49/51

Page 59: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

El futuro de C++

¿Qué puedo esperar?

Grandes novedades:

Módulos: ¡Acabemos con los includes!

Corrutinas: ¡Hagamos la asincronía sencilla!

Contratos: ¡Mejoremos la calidad de nuestro código!

Conceptos: ¡ Una mejor programación genérica!

Redes: ¡Programación portable del acceso a la red!

Rangos: ¡Una nueva biblioteca de contenedores!

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 49/51

Page 60: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

El futuro de C++

¿Qué puedo esperar?

Grandes novedades:

Módulos: ¡Acabemos con los includes!

Corrutinas: ¡Hagamos la asincronía sencilla!

Contratos: ¡Mejoremos la calidad de nuestro código!

Conceptos: ¡ Una mejor programación genérica!

Redes: ¡Programación portable del acceso a la red!

Rangos: ¡Una nueva biblioteca de contenedores!

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 49/51

Page 61: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

El futuro de C++

¿Qué puedo esperar?

Grandes novedades:

Módulos: ¡Acabemos con los includes!

Corrutinas: ¡Hagamos la asincronía sencilla!

Contratos: ¡Mejoremos la calidad de nuestro código!

Conceptos: ¡ Una mejor programación genérica!

Redes: ¡Programación portable del acceso a la red!

Rangos: ¡Una nueva biblioteca de contenedores!

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 49/51

Page 62: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

El futuro de C++

¿Qué puedo esperar?

Grandes novedades:

Módulos: ¡Acabemos con los includes!

Corrutinas: ¡Hagamos la asincronía sencilla!

Contratos: ¡Mejoremos la calidad de nuestro código!

Conceptos: ¡ Una mejor programación genérica!

Redes: ¡Programación portable del acceso a la red!

Rangos: ¡Una nueva biblioteca de contenedores!

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 49/51

Page 63: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

El futuro de C++

Recuerda todavía queda sitio para venir a using std::cpp2016.

http://www.usingstdcpp.org.

Podéis seguirme en Twitter.@jdgarciauc3m.@usingstdcpp.

Visitad mi página Web.https://www.arcos.inf.uc3m.es/wp/jdgarcia.

Y por favor:¡¡¡Dadme feedback!!!

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 50/51

Page 64: C++17 - El lenguaje que sustituirá a C++11/14 › 2016 › 11 › cpp17.pdfC++17 C++ C++ en dos líneas Correspondencia directa con el hardware. Instrucciones y tipos de datos fundamentales

C++17

El futuro de C++

C++17El lenguaje que sustituirá a C++11/14

J. Daniel Garcia

Grupo ARCOSUniversidad Carlos III de Madrid

19 de noviembre de 2016

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 51/51