Microsoft amorce le support des Concepts apportés par C++ 20 dans Visual Studio 2019 version 16.3 Preview 2,
au niveau du compilateur mais aussi de la bibliothèque

La bibliothèque de concepts fournit des définitions de concepts fondamentaux de bibliothèque qui peuvent être utilisés pour valider au moment de la compilation les arguments du modèle et effectuer la répartition des fonctions en fonction des propriétés des types. Ces concepts fournissent une base pour le raisonnement équationnel dans les programmes. La plupart des concepts de la bibliothèque standard imposent à la fois des exigences syntaxiques et sémantiques. En général, seules les exigences syntaxiques peuvent être vérifiées par le compilateur.

Quelques éléments de base :
  • same_as (C++20) : spécifie qu'un type est identique à un autre type (concept)
  • derived_from (C++20) : spécifie qu'un type est dérivé d'un autre type (concept)
  • convertible_to (C++20) : spécifie qu'un type est implicitement convertible en un autre type (concept)
  • common_reference_with (C++20) : spécifie que deux types partagent un type de référence commun (concept)
  • common_with (C++20) : spécifie que deux types partagent un type commun (concept)
  • integral (C++20) : spécifie qu'un type est un type intégral (concept)
  • signed_integral (C++20) : spécifie qu'un type est un type intégral qui est signé (concept)
  • unsigned_integral (C++20) : spécifie qu'un type est un type intégral non signé (concept)

Microsoft a expliqué que les Concepts C++ 20 est désormais prise en charge pour la première fois dans Visual Studio 2019 version 16.3 Preview 2. Cela inclut à la fois le support du compilateur et celui de la bibliothèque standard.

Dans un billet de blog, l'équipe note que « Premièrement, nous allons lancé cette fonctionnalité via le dernier mode /std:c ++ et une fois que toutes les fonctionnalités C++ 20 seront implémentées dans tous les produits Visual Studio (compilateur, bibliothèque, IntelliSense, système de build, débogueur, etc.), nous les fournirons via un nouveau mode /std:c++ 20. La prise en charge d’IntelliSense n’est actuellement pas disponible et notre implémentation n’inclut pas encore les modifications récentes apportées aux normes ISO C ++ réunies à Cologne ».

Nom : c++.png
Affichages : 4723
Taille : 206,2 Ko

Exemples

Voici quelques exemples sur la façon dont Concepts peut vous aider à écrire un code plus concis. Ils prennent également moins de temps pour compiler.

Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <concepts>
 
// This concept tests whether 'T::type' is a valid type
template<typename T>
concept has_type_member = requires { typename T::type; };
 
struct S1 {};
struct S2 { using type = int; };
 
static_assert(!has_type_member<S1>);
static_assert(has_type_member<S2>);
 
// Currently, MSVC doesn't support requires-expressions everywhere; they only work in concept definitions and in requires-clauses
//template <class T> constexpr bool has_type_member_f(T) { return requires{ typename T::type; }; }
template <class T> constexpr bool has_type_member_f(T) { return has_type_member<T>; }
 
static_assert(!has_type_member_f(S1{}));
static_assert(has_type_member_f(S2{}));
 
// This concept tests whether 'T::value' is a valid expression which can be implicitly converted to bool
// 'std::convertible_to' is a concept defined in <concepts>
template<typename T>
concept has_bool_value_member = requires { { T::value } -> std::convertible_to<bool>; };
 
struct S3 {};
struct S4 { static constexpr bool value = true; };
struct S5 { static constexpr S3 value{}; };
 
static_assert(!has_bool_value_member<S3>);
static_assert(has_bool_value_member<S4>);
static_assert(!has_bool_value_member<S5>);
 
// The function is only a viable candidate if 'T::value' is a valid expression which can be implicitly converted to bool
template<has_bool_value_member T>
bool get_value()
{
 return T::value;
}
 
// This concept tests whether 't + u' is a valid expression
template<typename T, typename U>
concept can_add = requires(T t, U u) { t + u; };
 
// The function is only a viable candidate if 't + u' is a valid expression
template<typename T, typename U> requires can_add<T, U>
auto add(T t, U u)
{
 return t + u;
}

Qu'en est-il de Range

La bibliothèque Range fournit des composants permettant de traiter des plages d'éléments, y compris une variété d'adaptateurs de vue.

Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
namespace std {
    namespace views = ranges::views;
}

L'alias std :: views de l'espace de noms est fourni sous forme abrégée pour std :: range :: views.

Microsoft explique que :

« Nous travaillons également sur Range. Il fournit des composants permettant de traiter des plages d’éléments et entretient une relation étroite avec Concepts.

« Dans l'intervalle, nous avons utilisé les implémentations de référence range-v3 et cmcstl2 pour tester la prise en charge de Concepts, qui ont permis de résoudre de nombreux problèmes. Certains sont liés à la mise en œuvre de Concepts et d'autres concernent des zones de fonctionnalités exposées par le nouveau modèle de codage activé par Concepts. Nous avons corrigé tous les problèmes de la première catégorie et la plupart des problèmes de la deuxième catégorie (les problèmes restants sont contournés dans la source). Nous compilons et exécutons maintenant tous les tests de ces bibliothèques au cours de notre CI (intégration continue).

« Les tests ont également permis d’exposer certains problèmes de source dans l’implémentation de référence et nous les avons signalés au propriétaire de la bibliothèque ».

Recherche de bibliothèques utilisant les fonctionnalités C++ 20

« Comme beaucoup d'autres nouvelles fonctionnalités que nous avons récemment implémentées, Concepts utilise également les nouvelles actions d'analyse syntaxique et d'analyse sémantique. Bien que leur couverture soit assez bonne et que nous ayons confiance en la qualité, l'expérience montre que nous rencontrons encore parfois des problèmes, en particulier lorsque les gens commencent à adopter de nouveaux modèles de codage activés par les nouvelles fonctionnalités.

« Nous sommes toujours à la recherche de bibliothèques qui utilisent beaucoup de nouvelles fonctionnalités. Si vous avez des bibliothèques qui utilisent Concepts ou d'autres fonctionnalités C ++ 20, veuillez nous en informer et nous sommes disposés à les ajouter à nos tests RWC (code du monde réel) quotidiens. Cela nous aidera à améliorer notre compilateur ».

Source : Microsoft

Et vous ?

Que pensez-vous de Concepts ?
Que pensez-vous de cette décision de Microsoft ?

Voir aussi :

Visual Studio Code 1.38 permet de préserver la casse dans "Rechercher et remplacer" et est livré avec TypeScript 3.6.2
Google rend open source la bibliothèque C++ qu'il utilise pour l'analyse des règles dans les fichiers robots.txt et formalise la spécification REP
La conception de C++ 20 est achevée et le premier brouillon sera publié en juillet 2019, les Modules et les Coroutines y sont présents