Оскільки поняття визначені як предикати часу компіляції, чи можливо також реально використовувати ці предикати для алгоритмів часу компіляції? Наприклад, чи можна було б перевірити, чи всі типи в кортежі відповідають поняттю? Наскільки я бачив, неможливо жодним чином передати поняття функції, що призводить мене до використання шаблонів для цих випадків.
#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>());
}
Я хотів би зробити щось подібне, тому мені не доведеться весь час обробляти цю концепцію, щоб мати можливість її використовувати:
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>());
}
Чи є якийсь спосіб наблизитися до цього?
all_types()
можна значно спростити , використовуючи кратні вираження... &&
:return (... && Predicate::template test<Ts>());