เนื่องจากแนวคิดถูกกำหนดให้เป็นเพรดิเคตเวลาคอมไพล์จึงเป็นไปได้หรือไม่ที่จะใช้เพรดิเคตเหล่านี้ซ้ำสำหรับอัลกอริธึมเวลารวบรวม เช่นเป็นไปได้ไหมที่จะตรวจสอบว่าทุกประเภทใน tuple สอดคล้องกับแนวคิดหรือไม่? เท่าที่ฉันได้เห็นมันเป็นไปไม่ได้ที่จะส่งแนวคิดไปยังฟังก์ชั่นในทางใดทางหนึ่งซึ่งทำให้ฉันกลับไปใช้แม่แบบสำหรับกรณีเหล่านี้
#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>());