Puisque les concepts sont définis comme des prédicats au moment de la compilation, est-il également possible de réutiliser ces prédicats pour les algorithmes au moment de la compilation? Par exemple, serait-il possible de vérifier si tous les types d'un tuple sont conformes à un concept? Pour autant que je l'ai vu, il n'est pas possible de transmettre un concept à une fonction, ce qui me ramène à l'utilisation de modèles pour ces cas.
#include <type_traits>
template<typename T>
concept FloatLike = std::is_same_v<T, float>;
struct IsFloat
{
template<typename U>
constexpr static bool test()
{
return FloatLike<U>;
}
};
template<typename Predicate, typename... T>
constexpr bool all_types()
{
return (Predicate::template test<T>() && ...);
}
int main()
{
static_assert(all_types<IsFloat, float, float>());
static_assert(!all_types<IsFloat, float, int>());
}
Ce que je voudrais faire, c'est quelque chose comme ça, donc je n'ai pas à envelopper le concept tout le temps pour pouvoir l'utiliser:
template<concept Predicate, typename... T>
constexpr bool all_types()
{
return (Predicate<T> && ...);
}
int main()
{
static_assert(all_types<FloatLike, float, float>());
static_assert(!all_types<FloatLike, float, int>());
}
Existe-t-il un moyen de se rapprocher de cela?
all_types()
peut être considérablement simplifié en utilisant des expressions de repli... &&
:return (... && Predicate::template test<Ts>());