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:
et
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;
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<Array T> void print(const T& a) { std::cout << "Youpi! ca marche!\n"; }
et
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;
Ce code ne compile pas et je ne vois pas d'où vient l'erreur; d'où deux questions:
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"; }
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) ?
Toute suggestion serait la bienvenue.
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;
Partager