Bonjour à tous,

Je suis entrain de me former sur les différentes notions qui ont récemment été introduites avec C++20. Parmi ces dernières, j'ai deux soucis de compréhension concernant les templates et les concepts.

Supposons que je souhaite définir un concept qui représente un tableau (std::vector ou std::span); j'ai alors:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
template<class T>
concept Array = std::is_same<std::vector<double>, T>::value || std::is_same<std::span<double>, T>::value;
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
template<Array T>
void print(const T& a) { std::cout << "Youpi! ca marche!\n"; }
Ces fragments de code compilent et s’exécutent bien. Supposons maintenant que je souhaite définir un concept qui représente un tableau dont a taille est connue (std::array); j'ai alors
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
template<template<unsigned int> class T, unsigned int S>
concept StaticArray = std::is_same<std::array<double, S>, T<S>>::value;
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
template<StaticArray T>
void print(const T& a) { std::cout << "Ploof! ca ne marche pas!\n"; }
Ce code ne compile pas et je ne vois pas d'où vient l'erreur; d'où deux questions:
1) d'où vient le problème?
2) comment écrire un concept encore plus générique qui subsume les deux précédents (un array peut être static ou dynamique) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
template<template<unsigned int> class T, unsigned int S>
concept AbstractArray = std::is_same<std::vector<double>, T>::value || std::is_same<std::span<double>, T>::value || std::is_same<std::array<double, S>, T<S>>::value;
Toute suggestion serait la bienvenue.