चूंकि अवधारणाओं को संकलन-समय की भविष्यवाणी के रूप में परिभाषित किया जाता है, क्या यह संकलन-समय के एल्गोरिदम के लिए वास्तव में इन विधेयकों का पुन: उपयोग करना संभव है? उदाहरण के लिए यह जाँचना संभव होगा कि क्या सभी प्रकार के टपल एक अवधारणा के अनुरूप हैं? जहां तक मैंने देखा है कि किसी भी तरह से एक फंक्शन को कॉन्सेप्ट पास करना संभव नहीं है, जो इन मामलों के लिए टेम्प्लेट का उपयोग करके मुझे वापस ले जाता है।
#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>());