Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
C++17
C++17The next generation
J. Daniel Garcia
Grupo ARCOSUniversidad Carlos III de Madrid
Noviembre 2017
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 1/126
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/126
C++17
ARCOS@uc3m
ARCOS: Investigación aplicada.Líneas: HPC, Big data, Sistemas ciberfísicos, Modelos deprogramación para la mejora de aplicaciones.
Mejora de aplicaciones:REPARA: Reengineering and Enabling Performance andpoweR of Applications. Financiado por Comisión Europea(FP7). 2013–2016RePhrase: REfactoring Parallel Heterogeneous ResourceAware Applications. Financiado por Comisión Europea(H2020). 2015–2018
Normalización:ISO/IEC JTC/SC22/WG21. ISO C++ standards committe.
C++11, C++14, C++17, C++20, . . .
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 3/126
C++17
C++ un lenguaje en evolución
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 4/126
C++17
Evolución
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 5/126
C++17
Pequeños cambios
1 Pequeños cambios
2 Aclaraciones
3 Programación genérica
4 Atributos
5 Simplificaciones
6 Algoritmos paralelos
7 Acceso al sistema de ficheros
8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 8/126
C++17
Pequeños cambios
Trigrafos
1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 9/126
C++17
Pequeños cambios
Trigrafos
Adios a los trigrafos
Un trigrafo es una secuencia de caracteres que permitesimular otro carácter.
Ejemplos:??= ⇒ #.??- ⇒ ˜.. . .
En C++17 los trigrafos dejan de ser estándar.Limitada utilidad hoy en día.Simplifica el análisis de código.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 10/126
C++17
Pequeños cambios
Trigrafos
Adios a los trigrafos
Un trigrafo es una secuencia de caracteres que permitesimular otro carácter.
Ejemplos:??= ⇒ #.??- ⇒ ˜.. . .
En C++17 los trigrafos dejan de ser estándar.Limitada utilidad hoy en día.Simplifica el análisis de código.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 10/126
C++17
Pequeños cambios
Keyword register
1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 11/126
C++17
Pequeños cambios
Keyword register
¡Hasta luego register!
La palabra reservada register está despreciada desdeC++11.
Uso legado de register
for (register int i=0; i<10; ++i) {v[ i ] = w[i ];
}
Eliminado en C++17.
La palabra register se mantiene reservada para usofuturo.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 12/126
C++17
Pequeños cambios
Incremento de booleanos
1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 13/126
C++17
Pequeños cambios
Incremento de booleanos
Eliminando operator++(bool)
El operador ++ sobre valores bool ha estadodespreciado desde C++98.
Usando el operador ++
bool x = false;x++; // x == truex++; // x == trueif (x++) do_whatever();if (std :: exchange(x,true)) do_whatever();
Se elimina de C++17
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 14/126
C++17
Pequeños cambios
Especificaciones dinámicas de excepciones
1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 15/126
C++17
Pequeños cambios
Especificaciones dinámicas de excepciones
Especifando excepciones
Las especificaciones dinámicas de excepciones estándespreciadas desde C++11.
Especificaciones de excepciones
void f () throw (std:: logic_error ) ;void g() throw();
Se eliminan en C++17
Especificaciones de excepciones
void f () ;void g() noexcept;
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 16/126
C++17
Pequeños cambios
Especificaciones dinámicas de excepciones
Especifando excepciones
Las especificaciones dinámicas de excepciones estándespreciadas desde C++11.
Especificaciones de excepciones
void f () throw (std:: logic_error ) ;void g() throw();
Se eliminan en C++17
Especificaciones de excepciones
void f () ;void g() noexcept;
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 16/126
C++17
Pequeños cambios
Clase auto_ptr
1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 17/126
C++17
Pequeños cambios
Clase auto_ptr
Punteros inteligentes
C++11 incorporó nuevos punteros inteligentes:unique_ptr.shared_ptr.weak_ptr.
C++11 despreció un puntero inteligente:auto_ptr.
C++17 elimina auto_ptr.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 18/126
C++17
Pequeños cambios
Clase auto_ptr
Punteros inteligentes
C++11 incorporó nuevos punteros inteligentes:unique_ptr.shared_ptr.weak_ptr.
C++11 despreció un puntero inteligente:auto_ptr.
C++17 elimina auto_ptr.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 18/126
C++17
Pequeños cambios
Reglas para iniciación
1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 19/126
C++17
Pequeños cambios
Reglas para iniciación
Iniciación de lista
C++11 introdujo la iniciación a partir de llaves.Podía ser de dos tipos:
Iniciación de copia:
T x = {a, b, c }; // T es initializer_list <decltype(a)>U y = {a}; // U es initializer_list <decltype(a)>
Iniciación directa:
T x {a, b, c }; // T es initializer_list <decltype(a)>U y {a}; // U es initializer_list <decltype(a)>, pero confuso
C++17 resuelve la confusiónT x {a, b, c }; // T es initializer_list <decltype(a)>U y {a}; // U es decltype(a)
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 20/126
C++17
Pequeños cambios
Reglas para iniciación
Iniciación de lista
C++11 introdujo la iniciación a partir de llaves.Podía ser de dos tipos:
Iniciación de copia:
T x = {a, b, c }; // T es initializer_list <decltype(a)>U y = {a}; // U es initializer_list <decltype(a)>
Iniciación directa:
T x {a, b, c }; // T es initializer_list <decltype(a)>U y {a}; // U es initializer_list <decltype(a)>, pero confuso
C++17 resuelve la confusiónT x {a, b, c }; // T es initializer_list <decltype(a)>U y {a}; // U es decltype(a)
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 20/126
C++17
Pequeños cambios
static_assert
1 Pequeños cambiosTrigrafosKeyword registerIncremento de booleanosEspecificaciones dinámicas de excepcionesClase auto_ptrReglas para iniciaciónstatic_assert
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 21/126
C++17
Pequeños cambios
static_assert
Aserciones en tiempo de compiación
C++11 introdujo las aserciones en tiempo de compilación.template <typename T>void f (T & x) {
static_assert (std :: is_integral_v<T>,"T debe ser un tipo numérico integral" ) ;
// ...}
void g() {f (5) ; // OKf (1.0) ; // Error de compilación// ...
}
C++17 hace el mensaje opcional.En muchos casos el mensaje por defecto es suficiente.Evita tener que replicar el texto dos veces.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 22/126
C++17
Pequeños cambios
static_assert
Aserciones en tiempo de compiación
C++11 introdujo las aserciones en tiempo de compilación.template <typename T>void f (T & x) {
static_assert (std :: is_integral_v<T>,"T debe ser un tipo numérico integral" ) ;
// ...}
void g() {f (5) ; // OKf (1.0) ; // Error de compilación// ...
}
C++17 hace el mensaje opcional.En muchos casos el mensaje por defecto es suficiente.Evita tener que replicar el texto dos veces.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 22/126
C++17
Aclaraciones
1 Pequeños cambios
2 Aclaraciones
3 Programación genérica
4 Atributos
5 Simplificaciones
6 Algoritmos paralelos
7 Acceso al sistema de ficheros
8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 23/126
C++17
Aclaraciones
Orden de evaluación
2 AclaracionesOrden de evaluaciónElusión de copiaExcepciones y punteros a funciónMemoria dinámica sobre-alineada
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 24/126
C++17
Aclaraciones
Orden de evaluación
Orden de evaluación
Orden de evaluación de operandos en C++11:void f () {
std :: string s = "but I have heard it works even if you don’t believe in it " ;s.replace(0, 4, "" ) .replace(s. find ("even"), 4, "only") .replace(
s. find (" don’t" ) , 6, "" ) ;assert(s == "I have heard it works only if you believe in it " ) ;// ...
}
Problema:Encadenamiento de llamadas a funciones miembro.Orden ejecución no definido en C++11.Error en “The C++ Programming Language. 4 Ed.”.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 25/126
C++17
Aclaraciones
Orden de evaluación
Orden de evaluación
Orden de evaluación de operandos en C++11:void f () {
std :: string s = "but I have heard it works even if you don’t believe in it " ;s.replace(0, 4, "" ) .replace(s. find ("even"), 4, "only") .replace(
s. find (" don’t" ) , 6, "" ) ;assert(s == "I have heard it works only if you believe in it " ) ;// ...
}
Problema:Encadenamiento de llamadas a funciones miembro.Orden ejecución no definido en C++11.Error en “The C++ Programming Language. 4 Ed.”.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 25/126
C++17
Aclaraciones
Orden de evaluación
Orden de evaluación
Otro ejemplo en C++11:void f () {
std :: map<int,int> v;v[0] = v.size () ;// ...
}
Resultado:{0,0}.{0,1}.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 26/126
C++17
Aclaraciones
Orden de evaluación
Fijando el orden en C++17
Se fija el orden de evaluación en:a.ba->ba->*ba(b1,b2,b3)b op= aa[b]a « ba » b
Pero:No se define el orden de evaluación de argumentos defunción.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 27/126
C++17
Aclaraciones
Orden de evaluación
Fijando el orden en C++17
Se fija el orden de evaluación en:a.ba->ba->*ba(b1,b2,b3)b op= aa[b]a « ba » b
Pero:No se define el orden de evaluación de argumentos defunción.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 27/126
C++17
Aclaraciones
Elusión de copia
2 AclaracionesOrden de evaluaciónElusión de copiaExcepciones y punteros a funciónMemoria dinámica sobre-alineada
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 28/126
C++17
Aclaraciones
Elusión de copia
Eludiendo copias temporales
El estándar permite evitar copias intermedias en algunsocasos:
Cuando se inicia un objeto con otro objeto temporal.Cuando se devuelve una variable local.Cuando se captura una excepción por valor.
Pero:Es una optimización opcional.Hace falta definir constructores de copia por si elcompilador no optimiza.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 29/126
C++17
Aclaraciones
Elusión de copia
Eludiendo copias temporales
El estándar permite evitar copias intermedias en algunsocasos:
Cuando se inicia un objeto con otro objeto temporal.Cuando se devuelve una variable local.Cuando se captura una excepción por valor.
Pero:Es una optimización opcional.Hace falta definir constructores de copia por si elcompilador no optimiza.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 29/126
C++17
Aclaraciones
Elusión de copia
Ejemplo de elusión
class X {public:
X(int n);X(const X &) = delete;X(X &&) = delete;// ...
};
X make_x(int z) { return X{z}; }
void f () {auto a = make_x(10); // Sin copias
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 30/126
C++17
Aclaraciones
Excepciones y punteros a función
2 AclaracionesOrden de evaluaciónElusión de copiaExcepciones y punteros a funciónMemoria dinámica sobre-alineada
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 31/126
C++17
Aclaraciones
Excepciones y punteros a función
Especificaciones de excepción
Las especificaciones de excepciones pasana a formarparte del tipo de la función.
// p1_t y p2_t son dos tipos distintosusing p1_t = int(∗) (char) noexcept;using p2_t = int(∗) (char);
Se puede convertir un valor de tipo puntero a excepciónnoexcept, a un tipo punter a excepción.
int f (char);int g(char) noexcept;// ...p1_t p1f = f ; // Errorp1_t p1g = g; // OKp2_t p2f = f ; // OKp2_t p2g = g; // Conversión
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 32/126
C++17
Aclaraciones
Excepciones y punteros a función
Especificaciones de excepción
Las especificaciones de excepciones pasana a formarparte del tipo de la función.
// p1_t y p2_t son dos tipos distintosusing p1_t = int(∗) (char) noexcept;using p2_t = int(∗) (char);
Se puede convertir un valor de tipo puntero a excepciónnoexcept, a un tipo punter a excepción.
int f (char);int g(char) noexcept;// ...p1_t p1f = f ; // Errorp1_t p1g = g; // OKp2_t p2f = f ; // OKp2_t p2g = g; // Conversión
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 32/126
C++17
Aclaraciones
Memoria dinámica sobre-alineada
2 AclaracionesOrden de evaluaciónElusión de copiaExcepciones y punteros a funciónMemoria dinámica sobre-alineada
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 33/126
C++17
Aclaraciones
Memoria dinámica sobre-alineada
new y alineamiento
En C++11/14 no hay garantías de alineamiento con new.struct alignas(16) vec {
float val [4];};
float ∗ v = new vec[100];
C++17 tiene en cuenta el alineamiento.void∗ operator new(size_t, align_val_t);void∗ operator new[](size_t, align_val_t ) ;void operator delete(void∗, align_val_t);void operator delete[](void∗, align_val_t ) ;void operator delete(void∗, size_t, align_val_t ) ;void operator delete[](void∗, size_t , align_val_t ) ;
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 34/126
C++17
Aclaraciones
Memoria dinámica sobre-alineada
new y alineamiento
En C++11/14 no hay garantías de alineamiento con new.struct alignas(16) vec {
float val [4];};
float ∗ v = new vec[100];
C++17 tiene en cuenta el alineamiento.void∗ operator new(size_t, align_val_t);void∗ operator new[](size_t, align_val_t ) ;void operator delete(void∗, align_val_t);void operator delete[](void∗, align_val_t ) ;void operator delete(void∗, size_t, align_val_t ) ;void operator delete[](void∗, size_t , align_val_t ) ;
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 34/126
C++17
Programación genérica
1 Pequeños cambios
2 Aclaraciones
3 Programación genérica
4 Atributos
5 Simplificaciones
6 Algoritmos paralelos
7 Acceso al sistema de ficheros
8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 35/126
C++17
Programación genérica
Deducción de argumentos de plantilla de clase
3 Programación genéricaDeducción de argumentos de plantilla de claseDeducción de valores en plantillasPlegamiento de expresionesif en tiempo de compilaciónOtros cambios en programación genérica
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 36/126
C++17
Programación genérica
Deducción de argumentos de plantilla de clase
Deducción de argumentos de función
En C++ siempre se deducen argumentos de plantillaimplícitamente.template <typename T>void f (T & x);
void g() {f (2) ; // f<int>(2)f (1.0) ; // f<double>(1.0)
complex<float> z;f (z) ; // f<complex<float>>(z);
vector<map<int,string>> v;f (v) ; // f<vector<map<int,string>>>
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 37/126
C++17
Programación genérica
Deducción de argumentos de plantilla de clase
Deduccion de argumentos de clase
Sin embargo, para clases . . .void g() {
std :: pair<int, string> p{1969, "Daniel" };
auto q = std :: make_pair(1950, "Bjarne");
std :: pair r{1955, "James"}; // Error faltan argumentos de plantilla}
No se pueden deducir los argumentos de plantilla enconstructor.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 38/126
C++17
Programación genérica
Deducción de argumentos de plantilla de clase
Deducción de argumentos
En C++17 se pueden deducir los argumentos de plantillade clase.std :: pair p{1969, "Daniel"s}; // std :: pair<int ,std :: string>
std :: map<int,double> create_dic();// std :: tuple<int , double, std :: map<int,double>>std :: tuple q{1, 2.5, create_dic() };
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 39/126
C++17
Programación genérica
Deducción de argumentos de plantilla de clase
Simplificación de código
Sin deducción:std :: mutex m1;std :: recursive_mutex m2;std :: shared_lock<std::recursive_mutex> sl{m2};std :: lock_guard<std::mutex, std::shared_lock<std::recursive_mutex>> l{m1,s1};
Con deducción en C++17:std :: mutex m1;std :: recursive_mutex m2;std :: shared_lock sl{m2};std :: lock_guard l{m1,s1};
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 40/126
C++17
Programación genérica
Deducción de argumentos de plantilla de clase
Simplificación de código
Sin deducción:std :: mutex m1;std :: recursive_mutex m2;std :: shared_lock<std::recursive_mutex> sl{m2};std :: lock_guard<std::mutex, std::shared_lock<std::recursive_mutex>> l{m1,s1};
Con deducción en C++17:std :: mutex m1;std :: recursive_mutex m2;std :: shared_lock sl{m2};std :: lock_guard l{m1,s1};
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 40/126
C++17
Programación genérica
Deducción de valores en plantillas
3 Programación genéricaDeducción de argumentos de plantilla de claseDeducción de valores en plantillasPlegamiento de expresionesif en tiempo de compilaciónOtros cambios en programación genérica
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 41/126
C++17
Programación genérica
Deducción de valores en plantillas
Valores como argumentos de plantilla
Un argumento de plantilla puede ser un valor.template <int n>class table;
table<10> t1; // n==10table<100> t2; // n==100
Se puede generalizar el tipo del valortemplate <typename T, T n>class table;
table<10> t1; // table<int,10>table<100UL> t2; // table<unsigned long, 100UL>
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 42/126
C++17
Programación genérica
Deducción de valores en plantillas
Valores como argumentos de plantilla
Un argumento de plantilla puede ser un valor.template <int n>class table;
table<10> t1; // n==10table<100> t2; // n==100
Se puede generalizar el tipo del valortemplate <typename T, T n>class table;
table<10> t1; // table<int,10>table<100UL> t2; // table<unsigned long, 100UL>
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 42/126
C++17
Programación genérica
Deducción de valores en plantillas
Simplificando argumentos valor
Se puede usar auto:template <auto n>class table;
table<10> t1; // decltype(n)=int , n=10table<100UL> t2; // decletype(n)=unsigned long, n=100UL
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 43/126
C++17
Programación genérica
Plegamiento de expresiones
3 Programación genéricaDeducción de argumentos de plantilla de claseDeducción de valores en plantillasPlegamiento de expresionesif en tiempo de compilaciónOtros cambios en programación genérica
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 44/126
C++17
Programación genérica
Plegamiento de expresiones
Sumando varios valores
Una función genérica de suma:auto suma() { return 0; }
template <typename T1>auto suma(T1 v1) { return v1; }
template <typename T1, typename T2>auto suma(T1 v1, T2 v2) { return v1+v2; }
template <typename T1, typename T2, typename T3>auto suma(T1 v1, T2 v2, T3 v3) { return v1+v2+v3; }
// ...
void f () {auto x = suma(1, 2.0);auto y = suma(1L, 1.5f, 2LL);// ...
}cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 45/126
C++17
Programación genérica
Plegamiento de expresiones
Suma variádica
Una función genérica de suma en C++11:auto suma() { return 0; }
template <typename T1, typename ... Ts>auto suma(T1 x1, Ts ... xs) {
return x1 + suma(xs...);}
void f () {auto x = suma(1, 2.0);auto y = suma(1L, 1.5f, 2LL);// ...
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 46/126
C++17
Programación genérica
Plegamiento de expresiones
Plegando expresiones
En C++17 se puede aplicar plegamiento para algunosoperadores.template <typename ... Ts>auto suma(Ts ... xs) { return (xs + ... + 0); }
o bien:template <typename ... Ts>auto suma(Ts ... xs) { return (... + xs); }
Expresiones válidas:(...⊗ args) → (. . . ((a1 ⊗ a2)⊗ a3)⊗ . . .)⊗ an(x ⊗ ...⊗ args) → (. . . ((x ⊗ a1)⊗ a2)⊗ . . .)⊗ an(args ⊗ ...) → a1 ⊗ (. . .⊗ (an−1 ⊗ an))(args ⊗ ...⊗ x) → a1 ⊗ (. . .⊗ (an−1 ⊗ (an ⊗ x)))
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 47/126
C++17
Programación genérica
Plegamiento de expresiones
Plegando expresiones
En C++17 se puede aplicar plegamiento para algunosoperadores.template <typename ... Ts>auto suma(Ts ... xs) { return (xs + ... + 0); }
o bien:template <typename ... Ts>auto suma(Ts ... xs) { return (... + xs); }
Expresiones válidas:(...⊗ args) → (. . . ((a1 ⊗ a2)⊗ a3)⊗ . . .)⊗ an(x ⊗ ...⊗ args) → (. . . ((x ⊗ a1)⊗ a2)⊗ . . .)⊗ an(args ⊗ ...) → a1 ⊗ (. . .⊗ (an−1 ⊗ an))(args ⊗ ...⊗ x) → a1 ⊗ (. . .⊗ (an−1 ⊗ (an ⊗ x)))
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 47/126
C++17
Programación genérica
if en tiempo de compilación
3 Programación genéricaDeducción de argumentos de plantilla de claseDeducción de valores en plantillasPlegamiento de expresionesif en tiempo de compilaciónOtros cambios en programación genérica
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 48/126
C++17
Programación genérica
if en tiempo de compilación
SFINAE
Dos versiones de una función con SFINAE.template <typename T,
std :: enable_if_t<std :: is_pointer<T>::value> ∗ = nullptr >auto get(T v) { return ∗v; }
template <typename T,std :: enable_if_t<!std :: is_pointer<T>::value> ∗ = nullptr >
auto get(T v) { return v; }
void f () {int x;int ∗ p = x;
auto z1 = get(x) ;auto z2 = get(p);
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 49/126
C++17
Programación genérica
if en tiempo de compilación
Tag dispatching
Dos versiones con tag dispatching.template <typename T>auto get(T v, std :: true_type) { return ∗ v; }
template <typename T>auto get(T v, std :: false_type) { return v; }
template <typename T>auto get(T v) { return get( t , std :: is_pointer<T>::value); }
void f () {int x;int ∗ p = x;
auto z1 = get(x) ;auto z2 = get(p);
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 50/126
C++17
Programación genérica
if en tiempo de compilación
Selección en tiempo de compilación
Se pueden usar sentencias if que se evalúan en tiempode compilación.template <typename T>auto get(T v) {
if constexpr (std :: is_pointer_v<T>) { return ∗v; }else { return v; }
}
void f () {int x;int ∗ p = x;
auto z1 = get(x) ;auto z2 = get(p);
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 51/126
C++17
Programación genérica
Otros cambios en programación genérica
3 Programación genéricaDeducción de argumentos de plantilla de claseDeducción de valores en plantillasPlegamiento de expresionesif en tiempo de compilaciónOtros cambios en programación genérica
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 52/126
C++17
Programación genérica
Otros cambios en programación genérica
Más sobre plantillas
Uso de typename en vez de class en parámetrosplantilla de plantilla (template template parameters).Mejora de compatibilidad plantilla de plantillas conparámetros por defecto.Menos restricciones para parámetros de plantilla que noson tipos.
Punteros, referencias, y punteros a miembro.
Posibilidad de definir expresiones lambda que sonconstexpr.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 53/126
C++17
Atributos
1 Pequeños cambios
2 Aclaraciones
3 Programación genérica
4 Atributos
5 Simplificaciones
6 Algoritmos paralelos
7 Acceso al sistema de ficheros
8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 54/126
C++17
Atributos
Atributos en C++11/14
4 AtributosAtributos en C++11/14Nuevos atributosOtras modificaciones sobre atributos
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 55/126
C++17
Atributos
Atributos en C++11/14
Atributos
Una manera portable de introducir anotaciones.Mejor que __attribute__, __declspec, . . .No pueden tener efecto semántico.
Atributos existentes en C++11:[[noreturn]].[[carries_dependency]].alignas(num).
Atributos añadidos en C++14:[[deprecated]].[[deprecated("mensaje")]].
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 56/126
C++17
Atributos
Atributos en C++11/14
Atributos
Una manera portable de introducir anotaciones.Mejor que __attribute__, __declspec, . . .No pueden tener efecto semántico.
Atributos existentes en C++11:[[noreturn]].[[carries_dependency]].alignas(num).
Atributos añadidos en C++14:[[deprecated]].[[deprecated("mensaje")]].
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 56/126
C++17
Atributos
Atributos en C++11/14
Atributos
Una manera portable de introducir anotaciones.Mejor que __attribute__, __declspec, . . .No pueden tener efecto semántico.
Atributos existentes en C++11:[[noreturn]].[[carries_dependency]].alignas(num).
Atributos añadidos en C++14:[[deprecated]].[[deprecated("mensaje")]].
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 56/126
C++17
Atributos
Nuevos atributos
4 AtributosAtributos en C++11/14Nuevos atributosOtras modificaciones sobre atributos
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 57/126
C++17
Atributos
Nuevos atributos
Sentencias switch
Errores típicos en sentencias switch:switch (estado) {
case modo::inicio:procesa_inicio() ; // ¿Paso intencionado a siguiente caso?
case modo::intermedio:procesa_intermedio();break;
case modo::fin:procesa_fin(); // ¿Paso intencionado a siguiente caso?
default:procesa_defecto();
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 58/126
C++17
Atributos
Nuevos atributos
Mejorando switch
Fuerza a ser explícito sobre la intención con atributo[[fallthrough]].switch (estado) {
case modo::inicio:procesa_inicio() ; // Warning: fallthrough implí cito
case modo::intermedio:procesa_intermedio();break;
case modo::fin:procesa_fin(); // OK: falltrhough explí cito[[ fallthrough ]];
default:procesa_defecto();
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 59/126
C++17
Atributos
Nuevos atributos
Ignorando resultados
C++ permite ignorar el resultado de una función:int lee_bytes(std :: ifstream & f , int n);// ...void f (std :: ifstream & fs) {
lee_bytes(fs, 100); // resultado ignorado// ...
}
Se pude forzar que no se pueda ignorar con[[nodiscard]]:[[ nodiscard]] int lee_bytes(std :: ifstream & f , int n);// ...void f (std :: ifstream & fs) {
lee_bytes(fs, 100); // warning: resultado ignoradoint r = lee_bytes(fs, 50); // OK// ...
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 60/126
C++17
Atributos
Nuevos atributos
Ignorando resultados
C++ permite ignorar el resultado de una función:int lee_bytes(std :: ifstream & f , int n);// ...void f (std :: ifstream & fs) {
lee_bytes(fs, 100); // resultado ignorado// ...
}
Se pude forzar que no se pueda ignorar con[[nodiscard]]:[[ nodiscard]] int lee_bytes(std :: ifstream & f , int n);// ...void f (std :: ifstream & fs) {
lee_bytes(fs, 100); // warning: resultado ignoradoint r = lee_bytes(fs, 50); // OK// ...
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 60/126
C++17
Atributos
Nuevos atributos
Tipos no descartables
Se puede marcar un tipo como no descartable:[[ nodiscard]] struct resultado {
int resultado;string mensaje;
};
resultado haz_algo();
void f () {haz_algo(); // warning: resultado descartadoauto r = haz_algo(); // OK// ...
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 61/126
C++17
Atributos
Nuevos atributos
Variables no usadas
La mayoría de los compiladores emiten una advertencia sino se usa una variable.void f ( int a, int b) { // warning: b no usado
int z = 0; // warning: z no usadoreturn a ∗2;
}
Se puede expresar la intención con [[maybe_unused]]:void f ( int a, [[ maybe_unused]] int b) { // OK: b no usado
[[ maybe_unused]] int z = 0; // OK: z no usadoreturn a ∗2;
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 62/126
C++17
Atributos
Nuevos atributos
Variables no usadas
La mayoría de los compiladores emiten una advertencia sino se usa una variable.void f ( int a, int b) { // warning: b no usado
int z = 0; // warning: z no usadoreturn a ∗2;
}
Se puede expresar la intención con [[maybe_unused]]:void f ( int a, [[ maybe_unused]] int b) { // OK: b no usado
[[ maybe_unused]] int z = 0; // OK: z no usadoreturn a ∗2;
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 62/126
C++17
Atributos
Otras modificaciones sobre atributos
4 AtributosAtributos en C++11/14Nuevos atributosOtras modificaciones sobre atributos
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 63/126
C++17
Atributos
Otras modificaciones sobre atributos
Atributos en nuevos lugares
Se añaden atributos a nuevos elementos:Espacios de nombre:namespace [[deprecated]] mi_lib_anterior {
void f1 () ;// ...
}
void g() {mi_lib_anterior :: f1 () ; // Warning: deprecated// ...
}
Enumeradores de un enumerado:enum modo {
apagado,enciendiendo [[deprecated]],encendido
};
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 64/126
C++17
Atributos
Otras modificaciones sobre atributos
Atributos desconocidos ignorados
Antes de C++17 un compilador podía dar un error para unatributo que no reconocía (p.ej. de otro compilador):void f (void ∗ p) {
[[ gsl :: supress("type") ]] // Solamente reconocido por clang−tidyint ∗ q = reinterpret_cast<int∗>(p);// ...
}
Ahora no puede dar un error.Aunque si un warning.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 65/126
C++17
Atributos
Otras modificaciones sobre atributos
Espacios de nombre y atributos
En C++11/14 los espacios de nombre de atributos debencualificar explícitamente cada atributo.void f (X x, Y y) {
[[ rpr :: kernel, rpr :: target (cpu,gpu,fpga), rpr :: in (x) , rpr :: out(y) ]]do_f(x,y) ;// ...
}
En C++17 se puede evitar la repetición:void f (X x, Y y) {
[[ using rpr: kernel, target (cpu,gpu,fpga), in (x) , out(y) ]]do_f(x,y) ;// ...
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 66/126
C++17
Atributos
Otras modificaciones sobre atributos
Espacios de nombre y atributos
En C++11/14 los espacios de nombre de atributos debencualificar explícitamente cada atributo.void f (X x, Y y) {
[[ rpr :: kernel, rpr :: target (cpu,gpu,fpga), rpr :: in (x) , rpr :: out(y) ]]do_f(x,y) ;// ...
}
En C++17 se puede evitar la repetición:void f (X x, Y y) {
[[ using rpr: kernel, target (cpu,gpu,fpga), in (x) , out(y) ]]do_f(x,y) ;// ...
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 66/126
C++17
Simplificaciones
1 Pequeños cambios
2 Aclaraciones
3 Programación genérica
4 Atributos
5 Simplificaciones
6 Algoritmos paralelos
7 Acceso al sistema de ficheros
8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 67/126
C++17
Simplificaciones
Vinculación estructurada
5 SimplificacionesVinculación estructuradaIniciación en if y switchVariables inline
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 68/126
C++17
Simplificaciones
Vinculación estructurada
Múltiples valores de retorno
En C++14, se pueden gestionar múltiples valores deretorno con std::tuple y std::tie.std :: tuple<int, string , bool> f() {
return make_tuple(1, "hola", false) ;}
void g() {int n;std :: string msg;bool result ;
std :: tie (n, msg, result) = f () ;// ...
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 69/126
C++17
Simplificaciones
Vinculación estructurada
Vinculación estructurada
En C++17, se introducen las vinculacionesestructuradas:std :: tuple<int, string , bool> f() {
return make_tuple(1, "hola", false) ;}
void g() {auto [n, msg, result ] = f () ;// ...
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 70/126
C++17
Simplificaciones
Vinculación estructurada
Otras vinculaciones estructuradas
Las vinculaciones estructuradas no están limitadas atuplas.
Arrays:double v[] = {1, 2, 3};auto [a,b,c] = v;
Para cualquier tipo que soporte tuple_size<> yget<N>() (p. ej. std::pair).pair<int, string> f () ;
auto [x,y] = f () ;
Estructuras sin datos miembro estáticos.struct X { int a; double b; char c; };X f () ;const auto [x,y,z] = f () ;
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 71/126
C++17
Simplificaciones
Vinculación estructurada
Otras vinculaciones estructuradas
Las vinculaciones estructuradas no están limitadas atuplas.
Arrays:double v[] = {1, 2, 3};auto [a,b,c] = v;
Para cualquier tipo que soporte tuple_size<> yget<N>() (p. ej. std::pair).pair<int, string> f () ;
auto [x,y] = f () ;
Estructuras sin datos miembro estáticos.struct X { int a; double b; char c; };X f () ;const auto [x,y,z] = f () ;
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 71/126
C++17
Simplificaciones
Vinculación estructurada
Otras vinculaciones estructuradas
Las vinculaciones estructuradas no están limitadas atuplas.
Arrays:double v[] = {1, 2, 3};auto [a,b,c] = v;
Para cualquier tipo que soporte tuple_size<> yget<N>() (p. ej. std::pair).pair<int, string> f () ;
auto [x,y] = f () ;
Estructuras sin datos miembro estáticos.struct X { int a; double b; char c; };X f () ;const auto [x,y,z] = f () ;
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 71/126
C++17
Simplificaciones
Vinculación estructurada
Combinando vinculaciones estructuradas y bucles derango
Se pueden combinar las vinculaciones estructuradas conel uso de bucles for basados en rango.std :: map<int, std:: string> dic ;// ...for (auto & [id , nombre] : dic) {
cout << "Id : " << id << "\n";cout << "Nombre: " << nombre << "\n";
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 72/126
C++17
Simplificaciones
Iniciación en if y switch
5 SimplificacionesVinculación estructuradaIniciación en if y switchVariables inline
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 73/126
C++17
Simplificaciones
Iniciación en if y switch
Iniciación en if
Se extiende la sintaxis de if para introducir declaracionesde variable.if ( init ; cond) statement;
Antes
{auto val = get_value();if (val>0) {
f (val ) ;}else throw invalid {};
}
Después
if (auto val = get_value(); val>0) {f (val ) ;
}else throw invalid {};
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 74/126
C++17
Simplificaciones
Iniciación en if y switch
Iniciación en if
Se extiende la sintaxis de if para introducir declaracionesde variable.if ( init ; cond) statement;
Antes
{auto val = get_value();if (val>0) {
f (val ) ;}else throw invalid {};
}
Después
if (auto val = get_value(); val>0) {f (val ) ;
}else throw invalid {};
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 74/126
C++17
Simplificaciones
Iniciación en if y switch
Iniciación en if
Se extiende la sintaxis de if para introducir declaracionesde variable.if ( init ; cond) statement;
Antes
{auto val = get_value();if (val>0) {
f (val ) ;}else throw invalid {};
}
Después
if (auto val = get_value(); val>0) {f (val ) ;
}else throw invalid {};
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 74/126
C++17
Simplificaciones
Iniciación en if y switch
Buscando en cadenas
Antes
{const auto it = texto . find ("hola") ;if ( it != string :: npos) {
cout << "Encontrado en posición "<< distance(text .begin() , it ) << "\n"
}}
Después
if (const auto it = texto . find ("hola") ; ( it != string :: npos) {cout << "Encontrado en posición "
<< distance(text .begin() , it ) << "\n"}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 75/126
C++17
Simplificaciones
Iniciación en if y switch
Buscando en cadenas
Antes
{const auto it = texto . find ("hola") ;if ( it != string :: npos) {
cout << "Encontrado en posición "<< distance(text .begin() , it ) << "\n"
}}
Después
if (const auto it = texto . find ("hola") ; ( it != string :: npos) {cout << "Encontrado en posición "
<< distance(text .begin() , it ) << "\n"}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 75/126
C++17
Simplificaciones
Iniciación en if y switch
Buscando en un mapa
Se puede combinar con vinculaciones estructuradas.
std :: map<int,std::string> m;// ...if (auto & [ it , encontrado] : m.insert(valor ) ; encontrado) {
f ( it ) ;}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 76/126
C++17
Simplificaciones
Iniciación en if y switch
Iniciación en switch
Funcionalidad extendida también a switch:
switch (auto x = get_value(); x.status () ) {case abierto:
procesa_abierto(x);break;
case cerrado:procesa_cerrado(x);break;
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 77/126
C++17
Simplificaciones
Variables inline
5 SimplificacionesVinculación estructuradaIniciación en if y switchVariables inline
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 78/126
C++17
Simplificaciones
Variables inline
Variables inline
Una variable marcada como inline:Puede aparecer en varias unidades de traducción si tienela misma definición.
Permite 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 79/126
C++17
Simplificaciones
Variables inline
Variables inline
Una variable marcada como inline:Puede aparecer en varias unidades de traducción si tienela misma definición.
Permite 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 79/126
C++17
Simplificaciones
Variables inline
Variables inline
Una variable marcada como inline:Puede aparecer en varias unidades de traducción si tienela misma definición.
Permite 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 79/126
C++17
Simplificaciones
Variables inline
Variables inline
Una variable marcada como inline:Puede aparecer en varias unidades de traducción si tienela misma definición.
Permite 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 79/126
C++17
Simplificaciones
Variables inline
Variables inline
Una variable marcada como inline:Puede aparecer en varias unidades de traducción si tienela misma definición.
Permite 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 79/126
C++17
Simplificaciones
Variables inline
Constantes en C++14
tabla.h
static constexpr max_elem = 4096;
class tabla {// ...
private:static constexpr max_valor = 1000000;// ...
};
tabla.cpp
static constexpr max_elem;static constexpr tabla :: max_valor;
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 80/126
C++17
Simplificaciones
Variables inline
Constantes en C++17
tabla.h
inline static constexpr max_elem = 4096;
class tabla {// ...
private:// Implícitament einlinestatic constexpr max_valor = 1000000;// ...
};
tabla.cpp
// Sin definiciones de constantes// ...
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 81/126
C++17
Algoritmos paralelos
1 Pequeños cambios
2 Aclaraciones
3 Programación genérica
4 Atributos
5 Simplificaciones
6 Algoritmos paralelos
7 Acceso al sistema de ficheros
8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 82/126
C++17
Algoritmos paralelos
Políticas de ejecución
6 Algoritmos paralelosPolíticas de ejecuciónVisión generalAlgoritmos no numéricosAlgortimos numéricos
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 83/126
C++17
Algoritmos paralelos
Políticas de ejecución
Introducción
Una Política de ejecución indica el tipo de paralelismoque se permite en la ejecución de un algoritmo.
Secuencial: Sin paralelizar.Tipo: std::execution::sequenced_policyObjeto global: std::execution::seq.
Paralelo: Paralelizado.Tipo: std::execution::parallel_policy.Objeto global: std::execution::par.
Paralelo + Vector: Paralelizado y vectorizado.Tipo:std::execution::parallel_unsequenced_policy.Objeto global: std::execution::par_unseq.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 84/126
C++17
Algoritmos paralelos
Políticas de ejecución
Versiones de algoritmos
Todos los algoritmos paralelos toman como primerparámetro una política de ejecución.
Ejemplo: ordenando un vector
using namespace std;vector<double> v = read_values();sort (v.begin() , v.end()) ;
using namespace std::execution;
sort (seq, v.begin() , v.end()) ; // Secuencialsort (par, v.begin() , v.end()) ; // Paralelosort (par_unseq, v.begin(), v.end()) ; // Paralelo+Vect
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 85/126
C++17
Algoritmos paralelos
Visión general
6 Algoritmos paralelosPolíticas de ejecuciónVisión generalAlgoritmos no numéricosAlgortimos numéricos
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 86/126
C++17
Algoritmos paralelos
Visión general
¿Qué algoritmos se incluyen?
La biblioteca de algoritmos paralelos incluye la mayorparte de los algoritmos de la STL.En todos los casos se añade un parámetro adicional paraindicar la política de ejecución.
Este parámetro se coloca el primero.Hay algoritmos de la STL que pueden no estar.
Ejemplo accumulate.Hay algoritmos que no provienen de la STL.
Ejemplo: exclusive_scan
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 87/126
C++17
Algoritmos paralelos
Visión general
Buscando en una secuencia
Ejemplos
vector<int> v = get_values_vector();count_if (par, begin(v), end(v),
[]( int x) { return x>0; }) ;auto p = find (par, begin(v), end(v), 0);auto q = find_if (par, begin(v), end(v),
[]( int x) { return (x>0) && (x<10); }
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 88/126
C++17
Algoritmos paralelos
Algoritmos no numéricos
6 Algoritmos paralelosPolíticas de ejecuciónVisión generalAlgoritmos no numéricosAlgortimos numéricos
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 89/126
C++17
Algoritmos paralelos
Algoritmos no numéricos
Algoritmos no numéricos
Son algoritmos que no requieren que los valoresaccedidos por los iteradores sean de un tipo numérico.
Más generales que los algoritmos numéricos.Ejemplos:
for_each().for_each_n().
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 90/126
C++17
Algoritmos paralelos
Algoritmos no numéricos
For Each
template <class ExecutionPolicy, class InputIterator, class Function>void for_each(ExecutionPolicy && ep,
InputIterator first , InputIterator last ,Function f ) ;
Aplica f al resultado de desreferenciar cada iterador en elrango [first,last).
Ejemplo
long cuenta_primos(const vector<int> & v) {std :: atomic<long> count;for_each(par, begin(v), end(v), [&]( int x) {
if (esprimo(x)) { count++; }}) ;return count;
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 91/126
C++17
Algoritmos paralelos
Algoritmos no numéricos
For Each
template <class ExecutionPolicy, class InputIterator, class Size, class Function>void for_each_n(ExecutionPolicy && ep,
InputIterator first , Size n,Function f ) ;
Aplica f al resultado de desreferenciar cada iterador en elrango [first, first+n).
Ejemplo
long cuenta_primos(const vector<int> & v, int k) {std :: atomic<long> count;for_each_(par, begin(v), k, [&]( int x) {
if (esprimo(x)) { count++; }}) ;return count;
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 92/126
C++17
Algoritmos paralelos
Algortimos numéricos
6 Algoritmos paralelosPolíticas de ejecuciónVisión generalAlgoritmos no numéricosAlgortimos numéricos
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 93/126
C++17
Algoritmos paralelos
Algortimos numéricos
Algoritmos numéricos
Algoritmos orientados a secuencias numéricas.reduce.exclusive_scan.inclusive_scan.transform_reduce.transform_exclusive_scan.transform_inclusive_scan.
También se añaden las versiones sin parámetro depolítica.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 94/126
C++17
Algoritmos paralelos
Algortimos numéricos
Operaciones básicas
Operaciones usadas en la definición de la semántica dealgoritmos.GENERALIZED_SUM yGENERALIZED_NONCOMMUTATIVE_SUM.
Conceptualmente suma (aunque aplicable a cualquieroperador).
GENERALIZED_SUM(op, a1, ..., aN):Concepto de suma commutativa.Puede aplicar la operación en cualquier orden.
Concepto de suma no commutativa.Restricciones sobre el orden.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 95/126
C++17
Algoritmos paralelos
Algortimos numéricos
GENERALIZED_SUM
GENERALIZED_SUM(op, a1, ..., aN):op(GENERALIZED_SUM(op,b1,..., bK),GENERALIZED_SUM(op,bL, ..., bN)).b1, ..., bK,bL, ..., bN es una permutación de a1,ldots, aN.
GENERALIZED_NONCOMMUTATIVE_SUM(op, a1, ...,aN):
op(GENERALIZED_SUM(op,a1,..., aK),GENERALIZED_SUM(op,aL, ..., bN)).
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 96/126
C++17
Algoritmos paralelos
Algortimos numéricos
reduce
template <class InputIterator, class T, class BinaryOperation>T reduce( InputIterator first , InputIterator last , T init , BinaryOperation op);
GENERALIZED_SUM(op, init, *first, ...)
op no puede invalidar iteradores en el rango tratado.op no puede modificar valores almacenados en el rango.reduce puede no ser determinista cuando op es noasociativo o no conmutativo.
Ejemplo
reduce(begin(v), end(v), 0, []( int a, int b) {return a+b; }) ;
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 97/126
C++17
Algoritmos paralelos
Algortimos numéricos
Variantes de reduce
template <class InputIterator, class T, class BinaryOperation>T reduce( InputIterator first , InputIterator last , T init ) ;
Utiliza como operación por defecto la suma.reduce(first,last,init,plus<>()).
template <class InputIterator, class T, class BinaryOperation>T reduce( InputIterator first , InputIterator last ) ;
Utiliza como operación por defecto la suma.Utiliza como valor por defecto el valor por defecto para eltipo usado para valores.reduce(first,last,x,plus<>()).
x es el valor por defecto para el tipo de valor.decltype(*first) x{};
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 98/126
C++17
Algoritmos paralelos
Algortimos numéricos
Variantes de reduce
template <class InputIterator, class T, class BinaryOperation>T reduce( InputIterator first , InputIterator last , T init ) ;
Utiliza como operación por defecto la suma.reduce(first,last,init,plus<>()).
template <class InputIterator, class T, class BinaryOperation>T reduce( InputIterator first , InputIterator last ) ;
Utiliza como operación por defecto la suma.Utiliza como valor por defecto el valor por defecto para eltipo usado para valores.reduce(first,last,x,plus<>()).
x es el valor por defecto para el tipo de valor.decltype(*first) x{};
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 98/126
C++17
Algoritmos paralelos
Algortimos numéricos
Transform reduce
template <class InputIterator, class T, class UnaryOp, class BinaryOp>T transform_reduce(InputIterator first , InputIterator last ,
UnaryOp unary_op, T init, BinaryOp binary_op);
Realiza una reducción con binary_op con el resultadode aplicar unary_op a los elementos.
unary_op no se aplica a init.Reducciones realizadas con GENERALIZED_SUM sobrebinary_op.
Ejemplo
auto suma_cuadrados = transform_reduce(begin(v), end(v),[]( double x) { return x ∗ x; },0,[]( double x, double y) { return x + y; }
) ;
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 99/126
C++17
Algoritmos paralelos
Algortimos numéricos
scan
Dos variantes:inclusive_scan: Realiza scan hasta i-ésimo elemento.exclusive_scan: Realiza scan hasta justo antes deli-ésimo elemento.
En ambos casos:Las operaciones se realizan en términos deGENERALIZED_NONCOMMUTATIVE_SUM.La operación no puede invalidar ni iteradores ni modificarelementos.
Ejemplo
auto fin = exclusive_scan(begin(v), end(v), begin(w));
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 100/126
C++17
Algoritmos paralelos
Algortimos numéricos
exclusive scan
template <class InputIterator, class OutputIterator , class T,class BinaryOp>
OutputIterator exclusive_scan( InputItertor first , InputIterator last ,OutputIterator out,T init , BinaryOp op);
Para cada i en el rango [out, out +(last-first)):
Le asigna el resultado deGENERALIZED_NONCOMMUTATIVE_SUM(op, init,*first, ..., *(first+(i-out)-1)).
Devuelve el fin del rango resultado.Si se omite op equivale a:
exclusive_scan(first, last, out, init,plus<>())
No se puede omitir init.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 101/126
C++17
Algoritmos paralelos
Algortimos numéricos
inclusive scan
template <class InputIterator, class OutputIterator , class T,class BinaryOp>
OutputIterator inclusive_scan( InputItertor first , InputIterator last ,OutputIterator out,T init , BinaryOp op);
Para cada i en el rango [out, out +(last-first)):
Le asigna el resultado deGENERALIZED_NONCOMMUTATIVE_SUM(op, init,*first, ..., *(first+(i-out))).
Devuelve el fin del rango resultado.Si se omite op equivale a:
exclusive_scan(first, last, out, init,plus<>())
Si se omite init no se incorpora a la suma generalizada.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 102/126
C++17
Algoritmos paralelos
Algortimos numéricos
Ejemplo
Calculando la CDF de un histograma
vector<int> histogram = compute_histogram();vector<int> cdf(histogram.size() , 0);inclusive_scan(par, begin(histogram), end(histogram),
begin(cdf)) ;
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 103/126
C++17
Algoritmos paralelos
Algortimos numéricos
transform scan
Una versión para transform_exclusive_scan
template <class InputIterator, class OutputIterator ,class UnaryOp, class T, class BinaryOp>
OutputIterator transform_exclusive_scan(InputItertor first , InputIterator last , OutputIterator out,UnaryOp unary_op, T init, BinaryOp binary_op);
Dos versiones para transform_inclusive_scan
template <class InputIterator, class OutputIterator ,class UnaryOp, class BinaryOp>
OutputIterator transform_inclusive_scan(InputItertor first , InputIterator last , OutputIterator out,UnaryOp unary_op, BinaryOp binary_op);
template <class InputIterator, class OutputIterator ,class UnaryOp, class BinaryOp, class T>
OutputIterator transform_exclusive_scan(InputItertor first , InputIterator last , OutputIterator out,UnaryOp unary_op, BinaryOp binary_op, T init);
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 104/126
C++17
Algoritmos paralelos
Algortimos numéricos
Ejemplo
Calculando la CDF de un histograma
vector<int> histogram = compute_histogram();vector<int> cdf(histogram.size() , 0);transform_inclusive_scan(par, begin(histogram), end(histogram),
begin(cdf)[]( int x) {
if (x<0) return 0;if (x>255) return 255;return x;
}[]( int x, int y) { return x+y; }) ;
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 105/126
C++17
Acceso al sistema de ficheros
1 Pequeños cambios
2 Aclaraciones
3 Programación genérica
4 Atributos
5 Simplificaciones
6 Algoritmos paralelos
7 Acceso al sistema de ficheros
8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 106/126
C++17
Acceso al sistema de ficheros
Sistema de ficheros
Ofrece una biblioteca portable para acceder al sistema dearchivos.
Archivo de cabecera <filesystem>.Espacio de nombres std::fileystem.
Componentes:Gestión de paths.Gestion de directorios.Recorrido de directorios.Funciones de soporte.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 107/126
C++17
Acceso al sistema de ficheros
Sistema de ficheros
Ofrece una biblioteca portable para acceder al sistema dearchivos.
Archivo de cabecera <filesystem>.Espacio de nombres std::fileystem.
Componentes:Gestión de paths.Gestion de directorios.Recorrido de directorios.Funciones de soporte.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 107/126
C++17
Acceso al sistema de ficheros
Información de una ruta
void f (std :: string path_name) {using fs = std :: filesystem;
fs :: path mi_path{path_name};cout << "exists () = " << fs :: exists (mi_path) << "\n"
<< "root_name() = " << mi_path.root_name() << "\n"<< "root_path() = " << mi_path.root_path() << "\n"<< "relative_path () = " << mi_path.relative_path() << "\n"<< "parent_path() = " << mi_path.parent_path() << "\n"<< "filename() = " << mi_path.filename() << "\n"<< "stem() = " << mi_path.stem() << "\n"<< "extension() = " << mi_path.extension() << "\n";
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 108/126
C++17
Acceso al sistema de ficheros
Componiendo un path
Operador /=:
using fs = namespace std::filesystem;fs :: path p{" /usr/include" };p /= "c++";p /= "7.2.0"p /= "iostream"
Operador +=:
using fs = namespace std::filesystem;fs :: path p{" /usr/include" };p += "c++";p += "7.2.0"p += "iostream"
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 109/126
C++17
Acceso al sistema de ficheros
Componiendo un path
Operador /=:
using fs = namespace std::filesystem;fs :: path p{" /usr/include" };p /= "c++";p /= "7.2.0"p /= "iostream"
Operador +=:
using fs = namespace std::filesystem;fs :: path p{" /usr/include" };p += "c++";p += "7.2.0"p += "iostream"
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 109/126
C++17
Acceso al sistema de ficheros
Recorriendo un path
void f (std :: filesystem :: path & p) {for (auto & x : p) {
cout << x << "\n";}
}
usrincludec++7.2.0iostream
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 110/126
C++17
Nuevos tipos en la biblioteca
1 Pequeños cambios
2 Aclaraciones
3 Programación genérica
4 Atributos
5 Simplificaciones
6 Algoritmos paralelos
7 Acceso al sistema de ficheros
8 Nuevos tipos en la bibliotecacbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 111/126
C++17
Nuevos tipos en la biblioteca
Valores generalizados
8 Nuevos tipos en la bibliotecaValores generalizadosValores opcionalesRegistros con variantesVistas sobre cadenas
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 112/126
C++17
Nuevos tipos en la biblioteca
Valores generalizados
Valores any
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 113/126
C++17
Nuevos tipos en la biblioteca
Valores opcionales
8 Nuevos tipos en la bibliotecaValores generalizadosValores opcionalesRegistros con variantesVistas sobre cadenas
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 114/126
C++17
Nuevos tipos en la biblioteca
Valores opcionales
Nueva clase optional
Nuevo tipo optional para representar un valor quepuede estar 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 115/126
C++17
Nuevos tipos en la biblioteca
Registros con variantes
8 Nuevos tipos en la bibliotecaValores generalizadosValores opcionalesRegistros con variantesVistas sobre cadenas
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 116/126
C++17
Nuevos tipos en la biblioteca
Registros con variantes
El tipo variant
Nuevo tipo variant valores de un número cerrado detipos
Es 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 117/126
C++17
Nuevos tipos en la biblioteca
Registros con variantes
struct mi_visitor {void operator()(const int & i) { std :: cout << " int : " << i << "\n"; }void operator()(const double & d) { std::cout << "double: " << d << "\n"; }
};
void f () {std :: variant<int, float> v;
v = 2.0;std :: visit ( mi_visitor {}, v) ;
v = 5;std :: visit ( mi_visitor {}, v) ;
}
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 118/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
8 Nuevos tipos en la bibliotecaValores generalizadosValores opcionalesRegistros con variantesVistas sobre cadenas
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 119/126
C++17
Nuevos tipos en la biblioteca
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 120/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
¿Y después?
Ya estamos trabajando en C++20:Mejor programación genérica con conceptos B. Stroustrupet al.Mejor procesamiento asíncrono con corrutinas G.NishanovMejor estructuración con módulos G. Dos ReisMejor detección de defectos con contratos J. DanielGarcía. . .
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 121/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
Resumen
Limpieza de características antiguas.
C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
Resumen
Limpieza de características antiguas.C++ es un lenguaje en constante evolución.
Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
Resumen
Limpieza de características antiguas.C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.
Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
Resumen
Limpieza de características antiguas.C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.
Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
Resumen
Limpieza de características antiguas.C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.
Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
Resumen
Limpieza de características antiguas.C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.
Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
Resumen
Limpieza de características antiguas.C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.
Algunos tipos nuevos en la biblioteca.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
Resumen
Limpieza de características antiguas.C++ es un lenguaje en constante evolución.Un lenguaje algo más predecible.Mejor soporte (ligeramente) de programación genérica.Mayor uso de atributos.Simplificaciones en el lenguaje para código más claro.Algoritmos paralelos y acceso al sistema de fichero.Algunos tipos nuevos en la biblioteca.
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 122/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
Si quieres más C++
https://usingstdcpp.org/
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 123/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
La fundación C++
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 124/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
No olvidéis
¡¡¡Dadme feedback!!!
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 125/126
C++17
Nuevos tipos en la biblioteca
Vistas sobre cadenas
C++17The next generation
J. Daniel Garcia
Grupo ARCOSUniversidad Carlos III de Madrid
Noviembre 2017
cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected]) – Twitter: @jdgarciauc3m 126/126