Vì các khái niệm được định nghĩa là các vị từ thời gian biên dịch, nên thực tế cũng có thể sử dụng lại các vị từ này cho các thuật toán thời gian biên dịch? Ví dụ, liệu có thể kiểm tra xem tất cả các loại trong một tuple có phù hợp với một khái niệm không? Theo như tôi đã thấy, không thể truyền khái niệm cho hàm theo bất kỳ cách nào, điều này dẫn tôi trở lại sử dụng các mẫu cho các trường hợp này.
#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>());
}
Những gì tôi muốn làm là một cái gì đó như thế này, vì vậy tôi không phải bao bọc khái niệm này mọi lúc để có thể sử dụng nó:
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>());
}
Có cách nào để đến gần hơn với điều này?
all_types()
có thể được đơn giản hóa đáng kể bằng cách sử dụng các biểu thức gấp... &&
:return (... && Predicate::template test<Ts>());